我做错了什么?我有一个查询来获取两个日期之间的数据,但它没有得到最后的日期。
我试过
before_install:
- composer self-update
和
select *
from data
where dates between '2016-01-01' and '2016-01-02'
我需要SQL Server在2016-01-01和2016-01-02之间返回数据
输出应为
select *
from data
where dates >= '2016-01-01' and dates <= '2016-01-02'
这有效
pid name date
-------------------------------
1 test2 2016-01-02
2 test2 2016-01-01
3 test3 2016-01-02
但为什么我需要额外增加一天?
答案 0 :(得分:7)
大概名为dates
的列(mis)有一个时间组件。这应该适用于你想要的东西:
select *
from data
where dates >= '2016-01-01' and dates < '2016-01-03';
SQL Server大师Aaron Bertrand在这个主题上有一篇很好的博客文章,What do BETWEEN
and the devil have in common?。这是一个很好的起点。
或者,您可以将查询编写为:
select *
from data
where cast(dates as date) >= '2016-01-01' and dates <= '2016-01-02';
删除时间组件后,比较将起作用。但是,我不愿意在列上使用函数,因为这可能会妨碍在查询中使用索引(SQL Server会将转换为date
作为例外)。
答案 1 :(得分:1)
我同意@GordonLinoff并正在设计一个示例给你看,所以无论如何我都会把它放在这里。请注意,您也可以通过投射到某个日期来从您的字段中删除时间组件,它将起作用。
WHERE CAST([date] as DATE) BETWEEN '2016-01-01' and '2016-01-02'
示例很明显
DECLARE @Data AS TABLE (pid INT, name VARCHAR(10), [date] date, [datetime] DATETIME)
INSERT INTO @Data (pid, name, [date], [datetime])
VALUES
(1, 'test1', '2016-01-02', '2016-01-02')
,(2, 'test2', '2016-01-01', '2016-01-01')
,(3, 'test3', '2016-01-02', '2016-01-02')
,(3, 'test3', '2016-01-02', '2016-01-02 11:00:00.000')
SELECT *
FROM
@Data
WHERE
[date] BETWEEN '2016-01-01' and '2016-01-02'
SELECT *
FROM
@Data
WHERE
[datetime] BETWEEN '2016-01-01' and '2016-01-02'
SELECT *
FROM
@Data
WHERE
CAST([datetime] AS DATE) BETWEEN '2016-01-01' and '2016-01-02'
答案 2 :(得分:0)
您的列是日期时间还是日期?你尝试过转换功能吗?
e.g。
CONVERT(VARCHAR(10),dates,110) --> 16-06-2016
我猜您有日期时间列,这意味着与今天的日期相比, 如果列是今天那么&gt; =将始终返回true并且&lt; =将始终返回false,因为持久保存到DB的时间戳可能是&gt; =今天00:00:00
答案 3 :(得分:0)
如果您的列日期类型为DATETIME
,则查询
select * from data
where dates >= '2016-01-01' and dates <= '2016-01-02'
仅提取日期介于2016-01-01 00:00:00.000
和2016-01-02 00:00:00.000
之间的记录。
它不会获取具有dates > 2016-01-02 00:00:00.000
的记录。如果您希望查询在2016-01-02 23:59:59.999
之前获取所有记录,那么您将不得不使用此查询:
select * from data
where dates >= '2016-01-01' and dates < '2016-01-03'