SQL“ between”不包含

我有一个问题是这样的:

SELECT * FROM Cases WHERE created_at BETWEEN '2013-05-01' AND '2013-05-01'

但是即使在1号有数据,也没有结果。

created_at看起来像 2013-05-01 22:25:19,我怀疑这和时间有关? 这怎么解决?

如果我使用更大的日期范围,那么它就可以正常工作,但是它也应该(包括)适用于单个日期。

208228 次浏览

包括 。您正在将日期时间与日期进行比较。第二个日期被解释为午夜 当一天开始的时候

解决这个问题的方法之一是:

SELECT *
FROM Cases
WHERE cast(created_at as date) BETWEEN '2013-05-01' AND '2013-05-01'

另一种解决方法是使用显式的二进制比较

SELECT *
FROM Cases
WHERE created_at >= '2013-05-01' AND created_at < '2013-05-02'

Aaron Bertrand 有一个关于日期的博客(给你) ,在那里他讨论了这个和其他的日期问题。

您需要做以下两种选择之一:

  1. 在你的 between条件中包括时间成分: ... where created_at between '2013-05-01 00:00:00' and '2013-05-01 23:59:59'(不推荐... 见最后一段)
  2. 使用不等式代替 between。注意,这样你就必须给第二个值增加一天: ... where (created_at >= '2013-05-01' and created_at < '2013-05-02')

我的个人喜好是第二个选择。而且,亚伦 · 伯特兰非常清楚地解释原因它应该被使用。

cast(created_at as date)

这只能在2008年和更新版本的 SQLServer 中使用

如果您使用的是旧版本,请使用

convert(varchar, created_at, 101)

我们假设 BETWEEN语法中的第二个日期引用神奇地被认为是“一天结束”,而不是 这不是真的

也就是说,这是预料之中的:

SELECT * FROM Cases
WHERE created_at BETWEEN the beginning of '2013-05-01' AND the end of '2013-05-01'

但真正发生的是:

SELECT * FROM Cases
WHERE created_at BETWEEN '2013-05-01 00:00:00+00000' AND '2013-05-01 00:00:00+00000'

这就相当于:

SELECT * FROM Cases WHERE created_at = '2013-05-01 00:00:00+00000'

问题在于人们对 BETWEEN的看法和预期,是的既包括范围内的较低值,也包括范围内的较高值,但是 没有奇迹般地把一个日期定为“开始”或“结束”。

按日期范围过滤时应避免使用 BETWEEN

始终 使用 >= AND <代替

SELECT * FROM Cases
WHERE (created_at >= '20130501' AND created_at < '20130502')

这里的括号是可选的,但在更复杂的查询中可能很重要。

只要用时间戳作为日期:

SELECT * FROM Cases WHERE date(created_at)='2013-05-01'

我发现将日期时间字段与日期字段进行比较的最佳解决方案如下:

DECLARE @StartDate DATE = '5/1/2013',
@EndDate   DATE = '5/1/2013'


SELECT *
FROM   cases
WHERE  Datediff(day, created_at, @StartDate) <= 0
AND Datediff(day, created_at, @EndDate) >= 0

这相当于一个包含两个语句的语句,因为它既包含开始日期和结束日期,也包含两个语句之间的日期。

你可以使用 date()函数从日期时间中提取日期,并将结果作为包含日期给你:

SELECT * FROM Cases WHERE date(created_at)='2013-05-01' AND '2013-05-01'

动态日期之间的 sql 查询

var startDate = '2019-08-22';
var Enddate = '2019-10-22'
let sql = "SELECT * FROM Cases WHERE created_at BETWEEN '?' AND '?'";
const users = await mysql.query( sql, [startDate, Enddate]);

你的密码

SELECT * FROM Cases WHERE created_at BETWEEN '2013-05-01' AND '2013-05-01'

SQL 如何读取它

SELECT * FROM Cases WHERE '2013-05-01 22:25:19' BETWEEN '2013-05-01 00:00:00' AND '2013-05-01 00:00:00'

如果你没有提到时间,而比较日期时间和日期默认小时: 分钟: 秒将是零在你的情况下日期是相同的,但如果你比较时间 created_at22 hours提前从你的结束日期范围

如果以上是明确的,你修复这在许多方面,如把结束时间在你的结束日期如 BETWEEN '2013-05-01' AND ''2013-05-01 23:59:59''

或者

简单地将 create _ at 转换为日期,如 cast(created_at as date),在转换为日期之后,'2013-05-01 22:25:19'将等于 '2013-05-01 00:00:00'

即使它是包容性的,根据 Aaron Bertrand 的建议(点击这里了解更多信息)

不要在日期/时间范围中使用 BETWEEN。

除了这里的其他好答案之外,还可以使用 DATEADD(为给定的日期增加天数) ,如下所示

SELECT * FROM Cases WHERE created_at >= '2013-05-01' AND created_at < DATEADD(day, 1, '2013-05-01')