在sql where子句之间使用date

时间:2015-02-19 18:22:37

标签: sql sql-server datetime mysqli

我有一张表格,其中包含origdt作为列。我想根据以下条件从表中提取所有记录

如果今天是星期二,那么就是在星期六早上到昨天晚上之间的起源 昨天早上到昨天晚上结束之间的其他消息

这是我写的查询,它给了我一个错误。

SELECT *
FROM A
WHERE 
    CASE 
        WHEN DATENAME(dw, GETDATE()) = 'Tuesday' 
        THEN 
        ( 
            OrigDt BETWEEN 
                CONVERT(SMALLDATETIME, CONVERT(VARCHAR(10), GETDATE() - 3, 101)) 
                AND DATEADD(SS, -1, CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101)))
        ) 
        ELSE 
        (
            OrigDt BETWEEN 
                CONVERT(SMALLDATETIME, CONVERT(VARCHAR(10), GETDATE() - 1, 101)) 
                AND DATEADD(SS, -1, CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101)))
        ) 
    END

错误是:在

之间的语法不正确

2 个答案:

答案 0 :(得分:1)

一开始你有很多不必要的皈依者,所以我把它们剥掉了。我假设你的第一次转换就是删除天数,这就是我把它变成了什么。

以下内容应该有效,您不需要使用案例:

SELECT *
FROM A
WHERE  
(DATENAME(dw, GETDATE()) = 'Tuesday' and
 OrigDt BETWEEN DateAdd(Day, -3, GETDATE()) AND DATEADD(SS, -1, GETDATE())
) 
or 
(DATENAME(dw, GETDATE()) <> 'Tuesday' and
 OrigDt BETWEEN DateAdd(Day, -1, GETDATE()) AND DATEADD(SS, -1, GETDATE())
)

答案 1 :(得分:0)

试试这个:

SELECT *
FROM A
WHERE OrigDt BETWEEN 

    --sod yesterday or sod Sat if today's Tues
    CAST(CAST(GETDATE()-
        --adjust offset according to today's date
        CASE WHEN DATEPART(dw, GETDATE()) = 3 THEN 3 ELSE 1 END 
    AS DATE) AS DATETIME) 

    --eod yesterday 
    AND DATEADD(SECOND,-1,CAST(CAST(GETDATE()-1 AS DATE) AS DATETIME))