我想检查字段是否不像 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
你应该像这样使用它:
DATEDIFF(YEAR,CONVERT(date, birthDate1, 112), GETDATE())
CONVERT
函数中的数字112
意味着我们提供日期yyyymmdd
的ISO格式。
请参阅此处以供参考。
您的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
为什么要将生日存储为字符串? 这是你的基本问题。 如果将值存储为日期,则不会有此问题。
即使你把它存储为约会,我认为你想要的逻辑是看看某人今天是否是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())