如何使用between子句获取两个日期之间的数据?

时间:2013-03-28 12:52:40

标签: sql sql-server

我在数据库中的日期字段格式为 2012-03-17 19:50:08.023

我想创建一个选择查询,它会为我提供三月月份中收集的数据。 但我无法做到这一点。

我正在尝试跟随查询。

select * from OrderHeader where
Convert(varchar,UploadDt,103) between '01/03/2013' and '31/03/2013' 
and DistUserUniqueID like  '6361%' 

此查询为我提供了所有日期的数据。

select * from OrderHeader where
UploadDt between '01/03/2013' and '31/03/2013' and DistUserUniqueID like  '6361%' 

此查询将错误显示为消息242,级别16,状态3,行1 将varchar数据类型转换为日期时间数据类型会导致超出范围的值。

请帮我解决这个问题。

提前致谢

2 个答案:

答案 0 :(得分:4)

第一个查询返回所有日期,因为您要将列转换为字符串。不知道你为什么要这样做。因此,当您说BETWEEN '01/anything' AND '31/anything'时,当您认为它现在只是一个字符串时,它将匹配列中的所有“日期”,无论月份和年份如何,因为您的WHERE子句将涵盖每个单日可能(除了3月以外的第31个月,以及1月和2月的第一天 - 所以不是所有的数据,而是非常大的百分比)。例如,'15/11/2026'BETWEEN '01\03\2013' AND '31/03/2013'

想一想。您在数据库中有日期时间数据,并且在查询之前要将其转换为字符串。在比较之前你还会将薪水转换为字符串吗?如果是这样的话,赚70,000美元的人看起来比赚690,000美元的人更多,因为基于字符的排序从第一个字符开始而不考虑长度。

第二个查询失败,因为您使用的是区域的,模糊的日期格式。您可能希望dd/mm/yyyy,但显然您的服务器基于美国英语格式,预计会mm/dd/yyyy

解决方案是使用正确,明确的格式,例如YYYYMMDD

BETWEEN '20130301' AND '20130313'

但是you shouldn't use BETWEEN - 因为这是您应该使用的DATETIME列:

WHERE UploadDt >= '20130301'
  AND UploadDt <  '20130401'

(否则,您将错过2013-03-31 00:00:00.0012013-03-31 23:59:59.997的所有数据。)

如果您真的喜欢BETWEEN,那么在2008年以上(您没有告诉我们您的版本),您可以使用:

WHERE CONVERT(DATE, UploadDt) BETWEEN '20130301' AND '20130313'

此处提供更多日期范围查询提示:

最后,when converting to VARCHAR (or any variable-length data types), always specify a length

答案 1 :(得分:-1)

将查询重写为

select * from OrderHeader where
UploadDt between '01/03/2013' and '01/04/2013' 
and DistUserUniqueID like  '6361%'

select * from OrderHeader where
UploadDt between Convert(datetime,'01/03/2013', 103) and Convert(datetime,'01/04/2013',103) 
and DistUserUniqueID like  '6361%'