在SQL中,我编写了一个SELECT
语句来获取两个日期之间的数据,使用BETWEEN AND
。
示例:
select *
from xxx
where dates between '2012-10-26' and '2012-10-27'
但返回的行仅适用于26日,而不是26日和27日。
您能帮助我吗?谢谢。
在SQL中,我编写了一个SELECT
语句来获取两个日期之间的数据,使用BETWEEN AND
。
示例:
select *
from xxx
where dates between '2012-10-26' and '2012-10-27'
但返回的行仅适用于26日,而不是26日和27日。
您能帮助我吗?谢谢。
如其他人所回答的,您可能拥有一个DATETIME
(或其他变体)列,而不是DATE
数据类型。
以下是适用于所有情况的条件,包括DATE
:
SELECT *
FROM xxx
WHERE dates >= '20121026'
AND dates < '20121028' --- one day after
--- it is converted to '2012-10-28 00:00:00.000'
;
@Aaron Bertrand在这篇文章中讲解了BETWEEN
和魔鬼的共同点。
between '1/1/2016 00:00:00'和'1/31/2016 23:59:59'
而不是between '1/1/2016'和'1/31/2016'
,但从来没有时间去探究为什么。 - James Toomeym/d/yyyy
查询有什么危险?我喜欢使用yyyy/mm/dd
进行屏幕输出,因为如果用户将其复制/粘贴到文本文件/其他地方,它会按字母顺序排序,但我怀疑你说的更多的是查询返回不准确数据的风险... - James Toomey您需要更加明确,同时添加开始和结束时间,包括毫秒数:
select *
from xxx
where dates between '2012-10-26 00:00:00.000' and '2012-10-27 23:59:59.997'
数据库可以很好地将'2012-10-27'
解释为'2012-10-27 00:00:00.000'
。
DATETIME
列,您需要指定 ..23:59:59.997
,因为 DATETIME
具有 3 毫秒的分辨率精度。对于 DATETIME2
,您的解决方案确实可以正常工作。 - marc_sselect cast('20120101 12:34:56.9999999' as datetime2)
。 - RichardTheKiwi... 23:59:59.999
,这对于 DATETIME2
是有效的(但对于 DATETIME
不是)。 - marc_s<
)select *
from xxx
where dates >= '20121026'
and dates < '20121028'
select *
from xxx
where CAST(dates as DATE) between '20121026' and '20121027'
您的问题并不是如何正确使用BETWEEN,而是请求帮助来处理意外截断的结果...
正如其他答案所提到/暗示的那样,问题在于您除了日期之外还有时间段。
根据我的经验,使用日期差值计算值得额外的键盘磨损。它允许您精确地表达您想要的,并且您会得到保障。
select *
from xxx
where datediff(d, '2012-10-26', dates) >=0
and datediff(d, dates,'2012-10-27') >=0
试试这个:
select *
from xxx
where dates >= '2012-10-26 00:00:00.000' and dates <= '2012-10-27 23:59:59.997'
2012-10-27 23:59:59.003
到 2012-10-27 23:59:59.997
的行 - 在该日期范围内可能还有一些行! - marc_sselect *
from xxx
where convert(date,dates) >= '2012-10-26' and convert(date,dates) <= '2012-10-27'
20121017 23:59:59.997
(日期使用YYYYMMDD
,无需使用破折号!)或2012-10-17T23:59:59.997
(日期中使用破折号,并在日期和时间部分之间使用固定的**T
**作为分隔符)。 - marc_s