在 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))
我有一个 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))