我的数据库中有格式为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%'
此查询给出的错误为Msg 242,Level 16,State 3,Line 1 将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。
请帮我解决这个问题。
提前致谢
最佳答案
第一个查询返回所有日期,因为您要将列转换为字符串。不知道你为什么要这样做。因此,当您说 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.001
到 2013-03-31 23:59:59.997
的所有数据。)
如果您真的喜欢 BETWEEN
那么在 2008 年以上(您没有告诉我们您的版本)您可以使用:
WHERE CONVERT(DATE, UploadDt) BETWEEN '20130301' AND '20130331'
更多与日期相关的提示:
最后,when converting to VARCHAR
(or any variable-length data types), always specify a length .
关于sql - 如何使用 Between 子句获取两个日期之间的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15682326/