我有一张表格,其中包含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
错误是:在
之间的语法不正确答案 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))