SQL Server:在日期之间的范围内包括最后日期

时间:2019-05-19 19:28:35

标签: sql sql-server

我有一个日期选择器FROM DATE和TO DATE。

如果用户输入FROM = {5/10/2019和TO = 5/19/2019,则数据仅返回直到5/18,但不包括5/19数据。

我希望它也包含5/19

我有以下T-SQL代码:

SELECT * 
FROM TABLE 
WHERE DATE >= '5/10/2019' AND DATE <= '5/19/2019'

但是我的问题是,如果表中的日期是5/19,它将不会显示

所以我需要这样的东西吗?

SELECT * 
FROM TABLE 
WHERE DATE >= '5/10/2019' AND DATE <= (('5/19/2019') + 1)

我还需要加上最后一个日期。

3 个答案:

答案 0 :(得分:3)

您的日期列可能包含时间部分。最安全的方法是:

WHERE DATE >= '2019-05-10' AND
      DATE < '2019-05-20'  -- note one day later

您可以这样表示:

WHERE DATE >= '2019-05-10' AND
      DATE < DATEADD(DAY, 1, '2019-05-20')

因此您可以捕获所需的输入。

SQL Server将使用索引进行迄今为止的转换,因此这样做也是合理的:

WHERE CONVERT(DATE, DATE) >= '2019-05-10' AND
      CONVERT(DATE, DATE) <- '2019-05-19' 

在大多数数据库中,此类转换会阻止使用索引,但是SQL Server是一个例外。

答案 1 :(得分:1)

您只需更改查询,使其仅显示小于(将<=更改为<)的查询,然后将日期增加一天:

SELECT * FROM TABLE WHERE DATE >= '5/10/2019' and DATE < '5/20/2019'

您可以使用DATEADD()功能将一天增加一倍

答案 2 :(得分:0)

这完全取决于“ DATE”列类型。根据您的解释,我假设DATE是datetime,datetime2是datetimeoffset类型。在这种情况下,当您写:

SELECT * 
FROM TABLE 
WHERE DATE >= '5/10/2019' AND DATE <= '5/19/2019'

它实际上翻译为:

SELECT * 
FROM TABLE 
WHERE DATE >= '5/10/2019 00:00:00' AND DATE <= '5/19/2019 00:00:00'

这就是为什么您未将5月19日包含在结果中的原因(实际上,您只是在5月19日的午夜才出现)。因此,有两种方法可以解决此问题(忽略性能):

SELECT * 
FROM TABLE 
WHERE DATE >= '5/10/2019' AND DATE <= DATEADD(DAY, 1, '5/19/2019')

SELECT * 
FROM TABLE 
WHERE DATE >= '5/10/2019' AND cast(DATE as date) <= '5/19/2019'