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