Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server DATEADD从现在起30天不包括一天_Sql Server_Date_Sql Server 2012 - Fatal编程技术网

Sql server DATEADD从现在起30天不包括一天

Sql server DATEADD从现在起30天不包括一天,sql-server,date,sql-server-2012,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, lon

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

仅考虑该表达式本身:

select DATEADD(day,-31, GETDATE())
2016-07-22 16:18:42.697
然后查找
test\u date
大于该日期时间的行

也许你需要消除时间部分,只考虑日子:

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

将找到日期时间,如
2016-07-22 10:15:00.420

仅考虑该表达式本身:

select DATEADD(day,-31, GETDATE())
2016-07-22 16:18:42.697
然后查找
test\u date
大于该日期时间的行

也许你需要消除时间部分,只考虑日子:

select DATEADD(day,-31, cast(GETDATE() as date))
2016-07-22
将找到日期时间,如
2016-07-22 10:15:00.420

GETDATE()
不仅包括日期,还包括运行时的时间戳

比如说

SELECT GETDATE() 
返回

2016-08-22 10:21:36.867

因此,当您在
DATEADD(day,-31,GETDATE())
中添加
-31
时,它会比较
测试日期是否大于或等于

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()
的更多信息,您可以查看。

GETDATE()
不仅包括日期,还包括运行时的时间戳

比如说

SELECT GETDATE() 
返回

2016-08-22 10:21:36.867

因此,当您在
DATEADD(day,-31,GETDATE())
中添加
-31
时,它会比较
测试日期是否大于或等于

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()
的更多信息,请查看。

DATEADD(day,-32,GETDATE())
也返回时间戳,因此
test\u date
运行此
DATEADD(day,-32,GETDATE())时的时间戳应大于当前时间
也返回时间戳,因此运行此操作时,
测试日期的时间戳应大于当前时间