如何在sql的where
子句中选择12/20/2008?
服务器是SQL server 2005。
select * from tblErrorLog
where errorDate = '12/20/2008'
答案 0 :(得分:69)
WHERE datetime_column >= '20081220 00:00:00.000'
AND datetime_column < '20081221 00:00:00.000'
答案 1 :(得分:22)
首先,我建议将ISO-8601标准格式用于日期/时间 - 无论SQL Server上的语言和区域设置如何,它都能正常工作。 ISO-8601是YYYYMMDD
格式 - 没有空格,没有破折号 - 只是数据:
select * from tblErrorLog
where errorDate = '20081220'
其次,您需要注意SQL Server 2005 DATETIME
总是包含时间。如果您只检查与日期部分的完全匹配,那么您将只获得与0:00:00时间匹配的行 - 没有别的。
您可以使用上面提到的任何推荐范围查询,或者在SQL Server 2008中,您可以使用DATE
唯一的日期时间 - 或者您可以检查以下内容:
select * from tblErrorLog
where DAY(errorDate) = 20 AND MONTH(errorDate) = 12 AND YEAR(errorDate) = 2008
无论哪种方式最适合你。
如果您经常需要执行此查询,您可以尝试将DATETIME
标准化为仅包含日期,也可以为DAY,MONTH和YEAR添加计算列:
ALTER TABLE tblErrorLog
ADD ErrorDay AS DAY(ErrorDate) PERSISTED
ALTER TABLE tblErrorLog
ADD ErrorMonth AS MONTH(ErrorDate) PERSISTED
ALTER TABLE tblErrorLog
ADD ErrorYear AS YEAR(ErrorDate) PERSISTED
然后您可以更轻松地查询:
select * from tblErrorLog
where ErrorMonth = 5 AND ErrorYear = 2009
等等。由于这些字段是计算和持久的,因此它们始终是最新的并且始终是最新的,并且由于它们是固定的,因此您甚至可以根据需要对它们进行索引。
答案 2 :(得分:12)
您没有说明您正在使用哪个数据库,但在MS SQL Server中它将是
WHERE DateField = {d '2008-12-20'}
如果是时间戳字段,那么您需要一个范围:
WHERE DateField BETWEEN {ts '2008-12-20 00:00:00'} AND {ts '2008-12-20 23:59:59'}
答案 3 :(得分:7)
假设我们正在谈论SQL Server DateTime
注意:BETWEEN包含两个范围的结尾,所以从技术上讲这个模式是错误的:
errorDate BETWEEN '12/20/2008' AND '12/21/2008'
我喜欢的时间范围的首选方法是:
'20081220' <= errorDate AND errordate < '20081221'
使用常见索引(范围扫描,SARGable,无功能)并在第二天的午夜正确剪辑,而不依赖于SQL Server的时间粒度(例如23:59:59.997)
答案 4 :(得分:4)
使用转换函数获取特定日期的所有条目。
Select * from tblErrorLog where convert(date,errorDate,101) = '12/20/2008'
有关详细信息,请参阅CAST and CONVERT
答案 5 :(得分:1)
select * from tblErrorLog
where errorDate BETWEEN '12/20/2008' AND DATEADD(DAY, 1, '12/20/2008')