2

我在数据库中有日期字段,格式为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 数据类型到 datetime 数据类型的转换导致超出范围的值。

请帮我解决这个问题。

提前致谢

4

2 回答 2

6

第一个查询返回所有日期,因为您要将列转换为字符串。不知道你为什么要这样做。因此,当您说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'

但是您不应该使用BETWEEN- 因为这是DATETIME您应该使用的列:

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

(否则您将错过任何来自 的数据2013-03-31 00:00:00.0012013-03-31 23:59:59.997

如果您真的喜欢BETWEEN2008+(您没有告诉我们您的版本),您可以使用:

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

更多与日期相关的提示:

最后,在转换为VARCHAR(或任何可变长度数据类型)时,始终指定一个长度

于 2013-03-28T12:55:12.110 回答
-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%'
于 2013-03-28T12:55:43.777 回答