我有一个日期选择器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)
我还需要加上最后一个日期。
答案 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'