如何在SQL Server中比较日期时间类型

3

我在SQL Server数据库中有一个datetime类型的列。我想要执行这个简单的select语句:

SELECT *
FROM Res
Where dateSubmit='6/17/2010 5:01:26 PM'

dateSubmit 是一个日期时间数据类型,我的数据库中有一行数据,其中 dateSubmit 的值为 6/17/2010 5:01:26 PM。

然而,当我执行这条语句时,它返回了空值(null)。


我的 MySQL 服务器回忆是需要将日期指定为年-月-日。 - Pointy
我也尝试过那个方法,但是它没有起作用,当我查看日期时间列中的实际值时,它是以月-日-年-时间格式显示的。 - Isawpalmetto
5个回答

7
我认为SQL Server保留的精度比显示的要高。
尝试以下操作:
SELECT * 
FROM Res 
Where dateSubmit between '6/17/2010 5:01:26 PM' and '6/17/2010 5:01:27 PM'

好的,这就解决了。非常感谢。它可能也在跟踪毫秒数或其他什么东西。 - Isawpalmetto
1
你真的想要 dateSubmit>='6/17/2010 5:01:26 PM' and dateSubmit<'6/17/2010 5:01:27 PM',因为 BETWEEN 会给你小于等于结束范围值的行,而你只想要小于结束值的行。 - KM.
根据我的经验,如果你使用ISO标准的日期时间字符串:'2010-06-17T17:01:26',SQL Server的表现会更好。如果你正在使用参数,请确保在尝试之前去掉毫秒。 - Toby
SQL Server的datetime确实可以跟踪毫秒,也就是小数秒,最多三位。详情请见:http://msdn.microsoft.com/zh-cn/library/ms187819.aspx - Valentino Vranken
@Mark Ransom,这就是为什么我从不使用BETWEEN,使用>=>以及<=<更加清晰明了。 - KM.
显示剩余2条评论

1
问题在于小时:分钟:秒部分,你永远无法得到精确的秒数,这就是为什么你会得到 null。 尝试使用


SELECT * 
FROM Res
Where DATEDIFF ( day , dateSubmit , '6/17/2010 5:01:26 PM' )=0

欲了解更多信息,请查看此链接

“day”可以替换为任何其他内容,如“DatePart”,请参见链接例如。

SELECT * 
FROM Res
Where DATEDIFF ( minute, dateSubmit , '6/17/2010 5:01:26 PM' )=0

0

当我在我的SQL Server版本(2005)中尝试运行类似的东西时,它按预期工作。

尝试去掉PM并改用24小时格式:

SELECT * 
FROM Res 
Where dateSubmit='6/17/2010 17:01:26' 

我之前尝试过,现在又尝试了一遍,但仍然不起作用。 - Isawpalmetto

0

如果时间无关,则剥离时间

Dateadd(d, datediff(d,0,getdate()),0)


我很遗憾需要时间。 - Isawpalmetto

0

看起來它應該可以運作。您可以嘗試使用以下語句: SELECT * FROM Res Where cast(dateSubmit as nvarchar) ='6/17/2010 5:01:26PM'


这将使索引无法使用,最好将字符串转换为日期时间,这样可以使用索引。此外,CONVERT更适合将datetime转换为字符串,您可以指定格式。 - KM.
另外,当我尝试这样做时,它不匹配,因为将其转换为nvarchar会将月份也作为字符串返回,例如“jun”。 - froadie
是的,转换会更好。 - MikeTWebb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接