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

检查字段是否不是0,然后检查年龄-带日期时间-SQL,sql,sql-server,tsql,sql-server-2014,Sql,Sql Server,Tsql,Sql Server 2014,我想检查字段是否与0不同, 然后我在哪里检查年龄是否比今天大 守则: 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,

我想检查字段是否与0不同, 然后我在哪里检查年龄是否比今天大

守则:

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岁。那么逻辑将是:

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

您应该这样使用它:

DATEDIFF(YEAR,CONVERT(date, birthDate1, 112), GETDATE())
WHERE ((birthDate1 <> '00000000') and DATEDIFF(YEAR,CONVERT(date, birthDate1, 112),GETDATE())>18)
   OR ((birthDate2 <> '00000000') and DATEDIFF(YEAR,CONVERT(date, birthDate2, 112),GETDATE())>18)
CONVERT函数中的数字112表示我们提供日期yyyymmdd的ISO格式

供参考

WHERE子句应如下所示:

DATEDIFF(YEAR,CONVERT(date, birthDate1, 112), GETDATE())
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

您应该这样使用它:

DATEDIFF(YEAR,CONVERT(date, birthDate1, 112), GETDATE())
WHERE ((birthDate1 <> '00000000') and DATEDIFF(YEAR,CONVERT(date, birthDate1, 112),GETDATE())>18)
   OR ((birthDate2 <> '00000000') and DATEDIFF(YEAR,CONVERT(date, birthDate2, 112),GETDATE())>18)
CONVERT函数中的数字112表示我们提供日期yyyymmdd的ISO格式

供参考

WHERE子句应如下所示:

DATEDIFF(YEAR,CONVERT(date, birthDate1, 112), GETDATE())
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


示例数据和期望的结果将非常有用。@Sami-我是try int,但它不是help@GordonLinoff-字段类型为:varchar2000您知道这不是检查年龄的正确方法吗?日期年。。。只检查年份的差异,不检查月份和天数。你能准确地告诉我们你所说的0.10年是什么意思吗?在我的职业生涯中,我花了很多时间为许多客户计算日历周期的小数部分。我可以告诉你,每个人都有不同的定义。样本数据和期望的结果会很有帮助。@Sami-我是try int,但不是help@GordonLinoff-字段类型为:varchar2000您知道这不是检查年龄的正确方法吗?日期年。。。只检查年份的差异,不检查月份和天数。你能准确地告诉我们你所说的0.10年是什么意思吗?在我的职业生涯中,我花了很多时间为许多客户计算日历周期的小数部分。我可以告诉你,每个人都有不同的定义。我无法更改类型,因为我从Out获得了此表,而第二个解决方案是“不帮助我”,我收到以下错误:从字符串转换日期和/或时间时转换失败。对不起。现在这是真正的代码,我需要所有超过69.10岁的人years@Ayal . . . 第二个版本无法使用此代码生成该错误,除非aa是视图。TRY_CONVERT`如果转换失败,则不会返回错误。它返回NULL。我无法更改类型,因为我从OUT获取的表,而第二个解决方案不是“帮助我”,我得到以下错误:从字符串转换日期和/或时间时转换失败。对不起。现在这是真正的代码,我需要所有超过69.10岁的人years@Ayal . . . 第二个版本无法使用此代码生成该错误,除非aa是视图。TRY_CONVERT`如果转换失败,则不会返回错误。它返回NULL。它向我显示一个错误:从字符串转换日期和/或时间时转换失败。从字符串转换日期和/或时间时,它仍然生成一个错误转换失败。是的,格式为YYMMDD。但是有些行的值是00000000,我找不到,给我发一个问题的链接,如果我想给where添加更多的条件,我在哪里添加它们?它向我显示一个错误:从字符串转换日期和/或时间时转换失败。从字符串转换日期和/或时间时,它仍然生成一个错误转换失败。是的,格式为YYMMDD。但是有些行的值是00000000,我找不到,请给我一个问题的链接,如果我想在where中添加更多条件,我在哪里添加它们?