我已经尝试了大约一千种不同的方法来尝试这种方法,经过几个小时的互联网搜索,并找到看似他们会工作的东西,我仍然无法正确地提出这一点。
我有一个查询,我通过Tableau在SQL中运行,我需要动态并更改为仅查看工作日。当我今天早上更新我的查询时,由于我们的服务器在前一天查看,它正在查找周日数据,在我公司周六或周日没有处理,我需要知道今天是星期一,(基本上)get getate() - 3,否则,getdate() - 1。
我试过声明一个变量,我尝试过这样的事情:
SELECT DATEADD(DAY, CASE DATENAME(WEEKDAY, GETDATE())
WHEN 'Sunday' THEN -2
WHEN 'Monday' THEN -3
ELSE -1 END, DATEDIFF(DAY, 0, GETDATE()))
不起作用,因为我的表中名为create_date的列被设置为正确的动态日期。如果我单独运行而不尝试合并到查询中(给我星期五的日期),这是有效的,但我无法弄清楚如何将该日期应用于我的查询。
这是我能够得到的最接近的
DECLARE @CREATIONDAY DATE
SET @CREATIONDAY = DAY, CASE DATENAME(WEEKDAY, convert(date,GETDATE()))
WHEN 'Sunday' THEN -2
WHEN 'Monday' THEN -3
ELSE -1 END, DATEDIFF(DAY, 0, GETDATE()));
SELECT CREATION_DATE, COUNT(*)
FROM [dbo].[workflow_document]
WHERE CREATION_DATE = @CREATIONDAY
GROUP BY CREATION_DATE
但仍然收到错误“消息102,级别15,状态1,第3行 “,”附近的语法不正确。“
不确定逗号会出现什么问题,但是我的工作结束了。一切都很赞赏!
答案 0 :(得分:0)
在处理星期计算时,请务必考虑当前的DATEFIRST设置。此查询将始终正确排除周末天数,使用@@DATEFIRST来说明一周中第一天的任何可能设置。
SELECT *
FROM your_table
WHERE ((DATEPART(dw, date_created) + @@DATEFIRST) % 7) NOT IN (0, 1)
答案 1 :(得分:0)
你的方法很好。您的变量定义中包含SET @CREATIONDAY = DATEADD(DAY,
(CASE DATENAME(WEEKDAY, convert(date,GETDATE()))
WHEN 'Sunday' THEN -2
WHEN 'Monday' THEN -3
ELSE -1
END),
GETDATE());
。所以:
WHERE
或者,只需将逻辑添加到WHERE (DATENAME(WEEKDAY, GETDATE()) = 'Sunday' AND
CREATION_DATE = DATEADD(DAY, -2, CAST(GETDATE as DATE))
) OR
(DATENAME(WEEKDAY, GETDATE()) = 'Monday' AND
CREATION_DATE = DATEADD(DAY, -3, CAST(GETDATE as DATE))
) OR
(DATENAME(WEEKDAY, GETDATE()) = 'Sunday' AND
CREATION_DATE = DATEADD(DAY, -2, CAST(GETDATE as DATE))
) OR
(DATENAME(WEEKDAY, GETDATE()) NOT IN ('Sunday', 'Monday') AND
CREATION_DATE = DATEADD(DAY, -1, CAST(GETDATE as DATE))
)
子句中:
myFunc()