SQL日期范围查询问题

时间:2016-02-24 16:02:00

标签: sql-server datetime date-range

我正在编写一个SQL查询,根据一组标准返回匹配的项目,其中一个标准是根据日期范围检查今天的日期 - 存储为两个单独的列' DateFrom'和' DateTo'

我的查询如下:

45.6%

如果DateFrom和DateTo不同,这可以正常工作,但我遇到的问题是我有一个在每个条目中具有相同值的条目,应该返回它,但它不是。

任何人都可以就此提出建议。感谢。

2 个答案:

答案 0 :(得分:2)

好吧,所以这是我自己的愚蠢错误,我通常把日期转换为varchar来修剪时间部分,但是@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)))

答案 1 :(得分:1)

问题是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