仅检查DateTime字段的日期部分

时间:2011-10-10 05:16:22

标签: sql sql-server-2005 tsql

我有一个类似的查询:

SELECT ..
        FROM ...
        WHERE ...
        AND ISNULL(ICA.actual_appearance_date, ICA.scheduled_appearance_date)  
            BETWEEN LO.order_start_date 
                AND ISNULL(LO.actual_expiry_date, LO.expected_expiry_date)

是否有一种简洁的方法只检查actual_appearance_date是否在开始日期和结束日期之间,但不包括时间?

所以:

外观日期是2011年10月3日@ 14h00 ...我们检查的日期是03 / Oct / 2011 @ 15h00和07 / Oct / 2011 @ 10h00。

目前,由于时间因素,这不会产生结果。我只需要在日期部分之间做一个......所以,在2011年10月3日@ 0h00和08/10月/ 2011 @ 0:00之间。

有没有一种巧妙的方法可以做到这一点?

编辑:

我们正在为2008年的机器开发,但我们正在开发2005年的机器。很长的故事,但我不能使用漂亮而整洁的DATE修复。

我正在尝试使用DATEADD方法,但我发现了一个问题。

这不会返回我期望的结果:

DECLARE  @Table TABLE
(
    StartDate DATETIME,
    EndDate DATETIME
)

INSERT INTO @Table VALUES ('02-Jan-2011 13:00:00', '07-Jan-2011 15:30:00')

SELECT * FROM @Table
DECLARE @Date DATETIME
SET @Date = '07-Jan-2011 16:00:00'

SELECT
    CASE WHEN 
        @Date BETWEEN DATEADD(dd,DATEDIFF(dd,0,StartDate),0) AND DATEADD(dd, DATEDIFF(dd,0,EndDate),0)-- must cover the appearance date or still open
    THEN 1
    ELSE 0
    END AS Result
FROM @Table

我必须在BETWEEN日期添加+1以包含最后日期吗? 'BETWEEN'似乎不包括最后一次约会..

2 个答案:

答案 0 :(得分:2)

你有SQL Server 2008所以只是转换为日期

SELECT .. 
FROM ... 
WHERE ... AND 
     CAST(ISNULL(ICA.actual_appearance_date, ICA.scheduled_appearance_date) AS date)
        BETWEEN
           CAST(LO.order_start_date AS date)
        AND 
           CAST(ISNULL(LO.actual_expiry_date, LO.expected_expiry_date) AS date)

对于SQL Server 2005及更早版本,请使用DATEDIFF / DATEADD技巧:Best approach to remove time part of datetime in SQL Server

不要使用varchar或float转换

编辑:,对于SQL Server 2005

您需要将DATEADD / DATEDIFF应用于所有

...
SELECT
    CASE WHEN 
         DATEADD(dd,DATEDIFF(dd,0,@Date),0)
              BETWEEN DATEADD(dd,DATEDIFF(dd,0,StartDate),0)
              AND DATEADD(dd, DATEDIFF(dd,0,EndDate),0)
    THEN 1
    ELSE 0
    END AS Result
FROM @Table

或者

WHERE ... AND 
     DATEADD(dd,DATEDIFF(dd,0,ISNULL(ICA.actual_appearance_date, ICA.scheduled_appearance_date),0)
        BETWEEN
           DATEADD(dd,DATEDIFF(dd,0,LO.order_start_date),0)
        AND 
           DATEADD(dd,DATEDIFF(dd,0,ISNULL(LO.actual_expiry_date, LO.expected_expiry_date),0)

答案 1 :(得分:-2)

您可以使用转换过程然后比较:

Convert(Datetime,Convert(Varchar,OrderDate,106),110)