在 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
和魔鬼有什么共同点?
您需要更明确地添加开始和结束时间,精确到毫秒:
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'
。
明确的写法是(即将第二个日期加 1 并使其成为
<
)
select *
from xxx
where dates >= '20121026'
and dates < '20121028'
如果您使用的是 SQL Server 2008 或更高版本,您可以安全地将 CAST 作为 DATE,同时保留 SARGability,例如
select *
from xxx
where CAST(dates as DATE) between '20121026' and '20121027'
这明确告诉 SQL Server 您只对
dates
列的 DATE 部分感兴趣,以便与 BETWEEN 范围进行比较。
您的问题没有询问如何正确使用 BETWEEN ,而是寻求有关意外截断结果的帮助...
正如其他答案中提到/暗示的那样,问题是除了日期之外,您还有时间段。
根据我的经验,使用日期差异值得键盘上的额外磨损/撕裂。它可以让你准确地表达你想要的内容,并且你可以得到满足。
select *
from xxx
where datediff(d, '2012-10-26', dates) >=0
and datediff(d, dates,'2012-10-27') >=0
使用 datediff,如果第一个日期早于第二个日期,您将得到一个正数。有多种方法可以编写上面的内容,例如始终先写字段,然后写常量。只需翻转操作符即可。这是个人喜好的问题。
您可以通过删除一个或两个等号来明确是否要包含或排除端点。
BETWEEN 适用于您的情况,因为端点都被假定为午夜(即日期)。 如果您的端点也是 DATETIME,则使用 BETWEEN 可能需要更多转换。 在我看来,DATEDIFF 被放入我们的生活中是为了使我们免受这些问题的影响。
试试这个:
select *
from xxx
where dates >= '2012-10-26 00:00:00.000' and dates <= '2012-10-27 23:59:59.997'
尝试使用以下查询
select *
from xxx
where convert(date,dates) >= '2012-10-26' and convert(date,dates) <= '2012-10-27'
是的,它不会为您获取第二个日期。您可以通过在 OR 条件中添加第二个日期来解决此问题。
示例:
选择* 来自xxx 其中日期介于“2012-10-26”和“2012-10-27”之间或日期位于(“2012-10-26”,“2012-10-27”)