检查归档是否不为 0,然后检查年龄 - 使用日期时间 - 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

你应该像这样使用它:

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()) 

最新更新