获取SQL仅返回最后一个工作日的数据

时间:2017-07-24 16:01:47

标签: sql

我已经尝试了大约一千种不同的方法来尝试这种方法,经过几个小时的互联网搜索,并找到看似他们会工作的东西,我仍然无法正确地提出这一点。

我有一个查询,我通过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行 “,”附近的语法不正确。“

不确定逗号会出现什么问题,但是我的工作结束了。一切都很赞赏!

2 个答案:

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