在 sql where 子句中使用日期

using date between in sql where clause

我有一个 table A,其中有一列是 origdt。我想根据以下条件

从table中提取所有记录

如果今天是星期二那么Origtdt在星期六早上到昨天晚上 else Origtdt between yesterday morning to yesterday evening end

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

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

错误是:Between

附近的语法不正确

好吧,首先你有很多不必要的皈依者,所以我把它们去掉了。我假设您的第一个转换是删除天数,所以这就是我把它变成的。

下面应该可以,你不需要使用大小写:

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())
)

试试这个:

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))