在sql where子句中使用日期介于之间

在sql where子句中使用日期介于之间,sql,sql-server,datetime,Sql,Sql Server,Datetime,我有一个表a,其中origdt作为一列。我想根据以下条件从表中提取所有记录 如果今天是星期二,那么从星期六早上到昨天晚上 从昨天早上到昨天晚上结束 这是我写的查询,它给了我一个错误 SELECT * FROM A WHERE CASE WHEN DATENAME(dw, GETDATE()) = 'Tuesday' THEN ( OrigDt BETWEEN CONVERT

我有一个表a,其中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

错误是:

之间的语法不正确。首先,您有很多不必要的转换,所以我已经去掉了这些转换。我以为你的第一个皈依者是删除天,所以我把它变成了这样

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

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())
)
选择*
从
哪里
(DATENAME(dw,GETDATE())=“星期二”和
DateAdd(Day,-3,GETDATE())和DateAdd(SS,-1,GETDATE())之间的起始日期
) 
或
(DATENAME(dw,GETDATE())“星期二”和
DateAdd(Day,-1,GETDATE())和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))

要检查,如果是星期一,您是否也希望数据从星期六开始,还是仅从星期天开始?要使其语言中立,您可以使用
DATEPART(dw,GETDATE())=3
代替
DATENAME(dw,GETDATE())='tuday'
;这也是一个非常小的性能优化。不可否认,你指的是哪一天就不那么明显了。这是个很棒的建议。我没有想到这一点。谢谢christian。一点问题都没有@user28455,总是很乐意帮忙:)根据你的逻辑,我会用这个。非常感谢约翰。