Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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 具有日期范围的T-SQL查询_Sql Server_Sql Server 2005_Tsql - Fatal编程技术网

Sql server 具有日期范围的T-SQL查询

Sql server 具有日期范围的T-SQL查询,sql-server,sql-server-2005,tsql,Sql Server,Sql Server 2005,Tsql,我有一个相当奇怪的“bug”,有一个简单的查询,我隐约记得很久以前在某个地方读过它的原因,但我希望有人能刷新我的记忆 该表是一个基本ID Datetime表 查询是: select ID, Datetime from Table where Datetime <= '2010-03-31 23:59:59' 从表中选择ID,Datetime,其中Datetime看到这一点很奇怪;我不知道为什么。但我建议您以这种方式编写查询: select ID, Datetime from Table

我有一个相当奇怪的“bug”,有一个简单的查询,我隐约记得很久以前在某个地方读过它的原因,但我希望有人能刷新我的记忆

该表是一个基本ID Datetime表

查询是:

select ID, Datetime from Table where Datetime <= '2010-03-31 23:59:59'

从表中选择ID,Datetime,其中Datetime看到这一点很奇怪;我不知道为什么。但我建议您以这种方式编写查询:

select ID, Datetime from Table where Datetime < '2010-04-01'
从Datetime<'2010-04-01'所在的表中选择ID、Datetime
试着像这样做:

select ID, Datetime from Table where Datetime < '2010-04-01'
通过使用加法,可以轻松增加日期时间:

SELECT GETDATE()+1
使用“23:59:59”可以忽略行,请尝试:

DECLARE @YourTable table (RowID int, DateOf datetime)
INSERT INTO @YourTable VALUES (1,'2010-03-31 10:00')
INSERT INTO @YourTable VALUES (2,'2010-03-31')
INSERT INTO @YourTable VALUES (3,'2010-03-31 23:59:59')
INSERT INTO @YourTable VALUES (4,'2010-03-31 23:59:59.887')
INSERT INTO @YourTable VALUES (5,'2010-04-01')
INSERT INTO @YourTable VALUES (6,'2010-04-01 10:00')
select * from @YourTable where DateOf <= '2010-03-31 23:59:59'
此查询是错误的,因为它找不到丢失的rowID=4记录

如果您尝试用以下方法解决此问题:

select * from @YourTable where DateOf <= '2010-03-31 23:59:59.999'
从@YourTable中选择*其中DateOf查看并

如果这是一个较小的datetime,它有1分钟的精度,所以如果四舍五入,datetime的精度是300毫秒

范例

DECLARE @d DATETIME
SELECT @d = '2001-12-31 23:59:59.999'

SELECT @d
2002-01-01 00:00:00.000

DECLARE @d DATETIME
SELECT @d = '2001-12-31 23:59:59.998'

SELECT @d
2001-12-3123:59:59.997

在你的情况下,总是在第二天午夜使用更少的药物

< '20100401'
“20100401”

+1用于解释实际情况,而不仅仅是列出其中一个解决方法。感谢您的解释,它符合我的记忆-然而,前几天我才意识到我的经验与您的两个示例都不太相符。在我的例子中,2010-04-01包含了从23:59:59到23:59:30的时间值。23:59:29将错误日期从结果集中排除。有什么想法吗?
DECLARE @d DATETIME
SELECT @d = '2001-12-31 23:59:59.998'

SELECT @d
< '20100401'