检查字段是否不为 0 然后检查年龄 - 日期时间 - SQL

Check if filed is not 0 then check age - with dateTime - SQL

我想检查字段是否不是 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

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

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

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

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

DATEDIFF() 计算两个日期之间的年份界限数。因此,无论日期如何,2000 年出生的人今年都会 return 18。或者,换句话说,对于今年年满 18 岁的人来说,return 18。

您可以使用 TRY_CONVERT():

修复您的查询
select *
from aa
where (TRY_CONVERT(date, BirthDate1) <= DATEADD(YEAR, -18, GETDATE()) OR
      (TRY_CONVERT(date, BirthDate2) <= DATEADD(YEAR, -18, GETDATE()) 

你应该这样使用它:

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