DATEADD从现在起30天内不包括一天

时间:2016-08-22 15:17:11

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

我有一个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 Management Studio 2012

2 个答案:

答案 0 :(得分:5)

单独考虑该表达式:

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之类的日期时间。

答案 1 :(得分:4)

SELECT GETDATE() 不包含日期,但在您运行时附带时间戳。

例如

-31

返回

  

2016-08-22 10:21:36.867

因此,当您在DATEADD(day,-31, GETDATE())中添加test_date时,会将您的CONVERT(date, DATEADD(day,-31, GETDATE())) 与大于或等于

进行比较
  

2016-07-22 10:21:36.867

比较日期的更合适的方法如下所述:

如果您需要具体了解天数

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

将导致只检索日期部分

  

2016年7月22日

如果您需要按日历月比较

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

有关CREATE OR REPLACE FUNCTION late_return_fee (number_of_books IN NUMBER, days_of_late_return IN NUMBER) RETURN DEC(4, 2) IS fee DEC(4,2); BEGIN fee := number_of_books *(days_of_late_return*0.50); RETURN fee; END; / 的详细信息,请查看this MSDN article