SQL Server:没有得到查询之间的最后日期

时间:2016-06-16 16:29:45

标签: sql sql-server

我做错了什么?我有一个查询来获取两个日期之间的数据,但它没有得到最后的日期。

我试过

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

但为什么我需要额外增加一天?

4 个答案:

答案 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.0002016-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'