SQL 日期范围查询问题
SQL Date Range Query Issue
我正在编写一个 SQL 查询,以根据一组条件 return 匹配项目,其中一个是根据日期范围检查今天的日期 - 存储为两个单独的列 'DateFrom' 和 'DateTo'
我的查询如下:
SELECT
A.*
FROM
A
LEFT OUTER JOIN
B ON A.AlertID = B.AlertID
WHERE
A.AlertTypeID > 1 AND A.Active = 1 AND
(B.Complete IS NULL OR B.Complete < 1) AND
(A.DateFrom IS NULL OR
((CONVERT(datetime, A.DateFrom, 103) <= CONVERT(datetime, GETDATE(), 103) AND
CONVERT(datetime, A.DateTo, 103) >= CONVERT(datetime, GETDATE(), 103))))
如果 DateFrom 和 DateTo 不同,这可以正常工作,但我遇到的问题是我有一个条目,每个条目都具有相同的值,它应该是 returned,但事实并非如此。
请任何人对此提出建议。谢谢
问题是CONVERT(datetime, GETDATE(), 103)
,如果你运行这个:
SELECT CONVERT(DATETIME, GETDATE(), 103)
你得到:
2016-02-24 16:19:57.840
我猜你只想比较值的日期部分,所以你实际上想要:
2016-02-24
所以在转换中使用 DATE
:
SELECT CONVERT(DATE, GETDATE(), 103)
这只是使用此逻辑的一段代码的快速模型,请使用您自己的数据进行测试以验证:
CREATE TABLE #temp
(
id INT ,
datefrom DATETIME ,
dateto DATETIME
)
INSERT INTO #temp
( id, datefrom, dateto )
VALUES ( 1, '2016-02-02', '2016-02-28' ), -- will match
( 2, '2016-02-27', '2016-02-28' ), -- won't match
( 3, '2016-02-23', '2016-02-23' ), -- yesterday no match
( 4, '2016-02-24', '2016-02-24' ) -- today matches
SELECT *
FROM #temp A
WHERE A.datefrom IS NULL
OR ( (CONVERT(DATE, A.datefrom, 103) <= CONVERT(DATE, GETDATE(), 103)
AND CONVERT(DATE, A.dateto, 103) >= CONVERT(DATE, GETDATE(), 103))
)
DROP TABLE #temp
生产:
id datefrom dateto
1 2016-02-02 00:00:00.000 2016-02-28 00:00:00.000
4 2016-02-24 00:00:00.000 2016-02-24 00:00:00.000
好吧,这是我自己的愚蠢错误,我通常将日期转换为 varchar 以 trim 关闭时间部分,但正如@MotoGP 现在向我展示了一种更简洁的方法,我感谢采纳,我的代码现在可以工作并且看起来如下:
SELECT
A.*
FROM
A
LEFT OUTER JOIN
B ON A.AlertID = B.AlertID
WHERE
AlertTypeID > 1 AND A.Active = 1 AND
(B.Complete IS NULL OR B.Complete < 1) AND
(A.DateFrom IS NULL OR
(CAST(A.DateFrom AS Date) >= CAST(GETDATE() AS Date) AND CAST(A.DateTo AS Date) <= CAST(GETDATE() AS Date)))
我正在编写一个 SQL 查询,以根据一组条件 return 匹配项目,其中一个是根据日期范围检查今天的日期 - 存储为两个单独的列 'DateFrom' 和 'DateTo'
我的查询如下:
SELECT
A.*
FROM
A
LEFT OUTER JOIN
B ON A.AlertID = B.AlertID
WHERE
A.AlertTypeID > 1 AND A.Active = 1 AND
(B.Complete IS NULL OR B.Complete < 1) AND
(A.DateFrom IS NULL OR
((CONVERT(datetime, A.DateFrom, 103) <= CONVERT(datetime, GETDATE(), 103) AND
CONVERT(datetime, A.DateTo, 103) >= CONVERT(datetime, GETDATE(), 103))))
如果 DateFrom 和 DateTo 不同,这可以正常工作,但我遇到的问题是我有一个条目,每个条目都具有相同的值,它应该是 returned,但事实并非如此。
请任何人对此提出建议。谢谢
问题是CONVERT(datetime, GETDATE(), 103)
,如果你运行这个:
SELECT CONVERT(DATETIME, GETDATE(), 103)
你得到:
2016-02-24 16:19:57.840
我猜你只想比较值的日期部分,所以你实际上想要:
2016-02-24
所以在转换中使用 DATE
:
SELECT CONVERT(DATE, GETDATE(), 103)
这只是使用此逻辑的一段代码的快速模型,请使用您自己的数据进行测试以验证:
CREATE TABLE #temp
(
id INT ,
datefrom DATETIME ,
dateto DATETIME
)
INSERT INTO #temp
( id, datefrom, dateto )
VALUES ( 1, '2016-02-02', '2016-02-28' ), -- will match
( 2, '2016-02-27', '2016-02-28' ), -- won't match
( 3, '2016-02-23', '2016-02-23' ), -- yesterday no match
( 4, '2016-02-24', '2016-02-24' ) -- today matches
SELECT *
FROM #temp A
WHERE A.datefrom IS NULL
OR ( (CONVERT(DATE, A.datefrom, 103) <= CONVERT(DATE, GETDATE(), 103)
AND CONVERT(DATE, A.dateto, 103) >= CONVERT(DATE, GETDATE(), 103))
)
DROP TABLE #temp
生产:
id datefrom dateto
1 2016-02-02 00:00:00.000 2016-02-28 00:00:00.000
4 2016-02-24 00:00:00.000 2016-02-24 00:00:00.000
好吧,这是我自己的愚蠢错误,我通常将日期转换为 varchar 以 trim 关闭时间部分,但正如@MotoGP 现在向我展示了一种更简洁的方法,我感谢采纳,我的代码现在可以工作并且看起来如下:
SELECT
A.*
FROM
A
LEFT OUTER JOIN
B ON A.AlertID = B.AlertID
WHERE
AlertTypeID > 1 AND A.Active = 1 AND
(B.Complete IS NULL OR B.Complete < 1) AND
(A.DateFrom IS NULL OR
(CAST(A.DateFrom AS Date) >= CAST(GETDATE() AS Date) AND CAST(A.DateTo AS Date) <= CAST(GETDATE() AS Date)))