【问题标题】:DATEADD 30 days from now is excluding one dayDATEADD 30 天后不包括 1 天
【发布时间】:2016-12-29 05:18:58
【问题描述】:

我有一个 sql 查询...

当我从今天开始运行此查询时,我将获得从 2016 年 7 月 22 日返回的记录。

SELECT test_id, lat, long
FROM  testDB.src.test_20
WHERE test_date >= DATEADD(day,-32, GETDATE()) and lat is not null and long is not null 

当我将 DATEADD 函数更改为 -31 时,我将获得 2016 年 7 月 23 日的记录。

SELECT test_id, lat, long
FROM  testDB.src.test_20
WHERE test_date >= DATEADD(day,-31, GETDATE()) and lat is not null and long is not null

我可能不清楚 DATEADD 函数的工作原理。我认为使用 -31 时会发生的情况是,将返回从今天到负 31 天前的记录,包括 2016 年 7 月 22 日的记录(因为从今天开始的 31 天前是 2016 年 7 月 22 日)。

为什么使用 -31 时不返回 2016 年 7 月 22 日的记录?

SQL Server 管理工作室 2012

【问题讨论】:

  • DATEADD(day,-32, GETDATE()) 也返回时间戳,因此test_date 的时间戳应该大于运行时的当前时间

标签: sql-server date sql-server-2012


【解决方案1】:

单独考虑这个表达式:

select DATEADD(day,-31, GETDATE())
2016-07-22 16:18:42.697

然后您查找test_date 大于该日期时间的行。

也许你需要去掉时间部分,只考虑天数:

select DATEADD(day,-31, cast(GETDATE() as date))
2016-07-22

会找到像2016-07-22 10:15:00.420 这样的日期时间。

【讨论】:

    【解决方案2】:

    GETDATE() 不仅包含日期,还附带运行时的时间戳。

    例如

    SELECT GETDATE() 
    

    返回

    2016-08-22 10:21:36.867

    所以,当您在DATEADD(day,-31, GETDATE()) 中添加-31 时,它会比较您的test_date 是否大于或等于

    2016-07-22 10:21:36.867

    下面描述了比较日期的更合适的方法:

    如果您需要具体说明天数

    CONVERT(date, DATEADD(day,-31, GETDATE()))
    

    这将导致仅检索日期部分

    2016-07-22

    如果您需要按日历月比较

    CONVERT(date, DATEADD(MONTH,-1, GETDATE()))
    

    所以,最后你应该把你的查询写成

    SELECT
        test_id,
        lat,
        long
    FROM testDB.src.test_20
    WHERE test_date >= CONVERT(date, DATEADD(DAY, -31, GETDATE()))
    AND lat IS NOT NULL
    AND long IS NOT NULL
    

    更多关于GETDATE()的信息,可以关注this MSDN article

    【讨论】:

      猜你喜欢
      • 2013-12-23
      • 2022-01-01
      • 2018-02-19
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多