【问题标题】:select month and year from Date of birth IN sql从 sql 中的出生日期中选择月份和年份
【发布时间】:2015-03-25 15:34:00
【问题描述】:

我有 DOB 列 ('2012-05-29 00:00:00.000') 和其他几个字段的表,我需要选择 6 个月到 6 年之间的 DOB 数据。我尝试使用下面的 SQL,但这并没有给我正确的数据。任何帮助将不胜感激。

select * from dbo.xyz
where ( FLOOR(DATEDIFF(MONTH, birth_date , GETDATE()) % 12) >=6
      AND  FLOOR(DATEDIFF(DAY, birth_date , GETDATE()) / 365.25) <= 6
      )

【问题讨论】:

  • 您是否要查找 DOB 比当前日期早 6 个月且早于当前日期

标签: sql sql-server sql-server-2008 tsql ssms


【解决方案1】:

使用日期时,建议仅对非列值使用函数。也就是说,修改getdate(),而不是birth_date

select *
from dbo.xyz
where birth_date between dateadd(year, -6,  getdate()) and dateadd(month, -6, getdate())

这有两个好处。首先,它使where 子句“sargable”,这意味着可以在比较中使用索引。更重要的是,使用datediff() 的替代方法并没有按预期工作。 datediff() 计算两个值之间的 日历边界 的数量。所以,2014-12-31 和 2015-01-01 相差一天,相差一个月,甚至相差一年。

【讨论】:

  • 感谢 Gordon 对日历边界的解释。
【解决方案2】:

试试这个

select * from dbo.xyz
where DATEDIFF(MONTH, birth_date , GETDATE()) between 6 and 72

【讨论】:

  • 这在逻辑上是正确的,但它是 nonSARGable,因为它必须评估每一行的 datediff。
【解决方案3】:

这是另一个允许按生日编制索引的选项。

select *
from dbo.xyz
where birthdate > DATEADD(YEAR, -6, GETDATE())
    and birthdate < DATEADD(MONTH, -6, GETDATE())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    相关资源
    最近更新 更多