第一个查询返回所有日期,因为您要将列转换为字符串。不知道你为什么要这样做。所以当你说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'
However 你不应该使用BETWEEN https://sqlblog.org/2011/10/19/what-do-between-and-the-devil-have-in-common- 因为这是一个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'
更多与日期相关的提示:
- 负责任地约会 https://sqlblog.org/dates
最后,当转换为VARCHAR(或任何可变长度数据类型),始终指定长度 https://sqlblog.org/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length.