gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:09:48 25 4
gpt4 key购买 nike

我在数据库中有格式为 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 子句将涵盖可能的每一天(好吧,除了三月以外的第 31 个月,以及一月和二月的第一天 - 所以不是所有数据,而是一个非常大的百分比)。例如,'15/11/2026'BETWEEN '01\03\2013' AND '31/03/2013'

想一想。您的数据库中有日期时间数据,您希望在查询之前将其转换为字符串。在比较之前,您还会将 salary 转换为字符串吗?如果是这样,赚 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 '20130331'

此处有更多与日期相关的提示:

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

关于sql - 如何使用 between 子句获取两个日期之间的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15682326/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com