【发布时间】:2023-03-28 13:15:01
【问题描述】:
对不起,如果标题令人困惑,但很难用一句话来解释我所追求的。
我目前正在根据本周的产量制作一份报告。我从以下内容开始我的 CTE 构建,以获得本周的周一至周五:
WITH
cte_Date AS
(
SELECT
CAST(DateTime AS date) AS Date
FROM
( VALUES
(GETDATE()
)
, (DATEADD(day,-1,GETDATE()))
, (DATEADD(day,-2,GETDATE()))
, (DATEADD(day,-3,GETDATE()))
, (DATEADD(day,-4,GETDATE()))
, (DATEADD(day,-5,GETDATE()))
, (DATEADD(day,-6,GETDATE())) ) AS LastSevenDays(DateTime)
WHERE
DATENAME(weekday, DateTime) = 'Monday'
UNION ALL
SELECT
DATEADD(day,1,Date)
FROM
cte_Date
WHERE
DATENAME(weekday,Date) <> 'Friday'
)
这工作正常。我已将报告提供给用户,因此他们可以随时运行它,但有时周五没有人可以运行它。这意味着他们无法在周五看到完整的作品,然后下周 CTE 天数会发生变化。
我试图保持一键式事件,而不是引入我向用户建议我们调整查询的日期参数,以便如果他们在“星期一”中午之前运行报告,那么它将最后显示一周的数字,他们对此很满意(我和我的大嘴巴)。我将星期一放在引号中,因为我们真正的意思当然是一周的第一天生产。
我的主数据表(我们将其称为 MyData)有一个名为 DateTime(真的!)的日期时间字段,我可以参考它来确定一周的第一天生产。
最后一个警告:由于报告的布局,用户坚持他们总是希望查看周一至周五的五天,即使在某一天没有生产。 (因此,我从 cte_Date 向所有其他所需的表执行 LEFT JOIN。)所以要清楚,现在我正在输入这个时间是当地时间周二上午 11:45,而昨天恰好是这里的公共假期,所以运行报告now 应该在上周的周一到周五返回,但在 20 分钟内运行它应该在本周的周一到周五返回。
请帮忙,我可怜的脑袋想弄明白。
【问题讨论】:
标签: sql-server date common-table-expression