【问题标题】:Check if filed is not 0 then check age - with dateTime - SQL检查字段是否不为 0,然后检查年龄 - 使用 dateTime - SQL
【发布时间】:2018-08-26 15:16:03
【问题描述】:

如果不是 0,我想检查该字段, 如果年龄大于今天,我会检查Where

代码:

select *
from aa
WHERE (datediff(month, dateadd(day,-day(birthDate1)+1,birthDate1),dateadd(day,-day(birthDate1)+1,GETDATE()))>=828.0)
   or (datediff(month, dateadd(day,-day(birthDate2)+1,birthDate2),dateadd(day,-day(birthDate2)+1,GETDATE()))>=828.0)

然后有一个异常:

Conversion failed when converting date and/or time from character string.

如果我只问一个问题,效果很好:

select *
from aa
WHERE (birthDate1 <> '00000000') and DATEDIFF(YEAR,birthDate1 ,GETDATE())>18

【问题讨论】:

  • 样本数据和期望的结果真的很有帮助。
  • @Sami - 我正在尝试 int 但它没有帮助
  • @GordonLinoff - 字段类型为:varchar(2000)
  • 您知道这不是检查年龄的正确方法吗? DATEDIFF(YEAR... 只检查年的差异,不检查月和日。
  • 您能准确地告诉我们您所说的 0.10 年是什么意思吗?在我的职业生涯中,我花了很多时间为许多客户制定日历周期的小部分。我可以告诉你,每个人都有不同的定义。

标签: sql sql-server tsql sql-server-2014


【解决方案1】:

你应该这样使用它:

DATEDIFF(YEAR,CONVERT(date, birthDate1, 112), GETDATE())

CONVERT函数中的数字112表示我们提供日期yyyymmdd的ISO格式。

See this 供参考。

您的WHERE 子句应如下所示:

WHERE ((birthDate1 <> '00000000') and DATEDIFF(YEAR,CONVERT(date, birthDate1, 112),GETDATE())>18)
   OR ((birthDate2 <> '00000000') and DATEDIFF(YEAR,CONVERT(date, birthDate2, 112),GETDATE())>18)

更新

你可以试试这个查询:

SELECT * FROM (
    SELECT *,
           CASE WHEN birthDate1 <> '00000000' THEN DATEDIFF(MONTH,CONVERT(date, birthDate1, 112),GETDATE()) END Age1,
           CASE WHEN birthDate2 <> '00000000' THEN DATEDIFF(MONTH,CONVERT(date, birthDate2, 112),GETDATE()) END Age2
    FROM my_table
) a WHERE Age1 > 838 OR Age2 > 838

【讨论】:

  • 它告诉我一个错误:Conversion failed when converting date and/or time from character string.
  • 它仍然会产生错误Conversion failed when converting date and/or time from character string.
  • 是的,格式是 yyyymmdd。但是有些行的值为 00000000
  • 我找不到,给我发个问题的链接
  • 如果我想向where 添加更多条件,我在哪里添加它们?
【解决方案2】:

为什么要将生日存储为字符串?这是你的基本问题。如果将值存储为日期,则不会出现此问题。

即使您将其存储为日期,我认为您想要的逻辑是查看某人今天是否 18 岁。那么逻辑是:

select *
from aa
where (BirthDate1 <= DATEADD(YEAR, -18, GETDATE()) OR
      (BirthDate2 <= DATEADD(YEAR, -18, GETDATE()) 

这表示生日在 18 年前的同一天或之前 - 更有可能是您想要的。

DATEDIFF() 计算两个日期之间的年份边界数。因此,无论日期如何,任何 2000 年出生的人都将在今年返回 18 岁。或者,换一种说法,今年满 18 岁的人将返回 18。

您可以使用TRY_CONVERT() 修复您的查询:

select *
from aa
where (TRY_CONVERT(date, BirthDate1) <= DATEADD(YEAR, -18, GETDATE()) OR
      (TRY_CONVERT(date, BirthDate2) <= DATEADD(YEAR, -18, GETDATE()) 

【讨论】:

  • 我无法更改类型,因为这张表是我从外面得到的
  • 第二个解决方案对我没有帮助,我得到这个错误:Conversion failed when converting date and/or time from character string.
  • 对不起。现在这是真正的代码,我需要所有 69.10 岁以上的人
  • @Ayal 。 . .第二个版本无法使用此代码生成该错误,除非aa 是一个视图. TRY_CONVERT()` 如果转换失败,则不会返回错误。它返回NULL
猜你喜欢
  • 2016-12-02
  • 2021-01-13
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 2020-04-04
  • 1970-01-01
  • 2013-06-20
相关资源
最近更新 更多