我有一个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
答案 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。