sql获取两个日期之间的每周开始日期
Posted
技术标签:
【中文标题】sql获取两个日期之间的每周开始日期【英文标题】:sql get every week start date between two dates 【发布时间】:2016-01-29 18:23:49 【问题描述】:我有一个包含这些数据的表
员工reported
的日期和那一周的start date
(星期一)。
现在他们没有工作所有的日期,例如圣诞节的那一周没有数据。
有没有办法可以添加缺少的一周。所以,我仍然会有每周的一周开始日期。但报告日期可以为空。
我不能声明变量。
【问题讨论】:
看这里:***.com/questions/9180308/… @JonH 我认为链接与问题无关。 @haytem - 你一定没有读过它......标量值函数允许他调用以获取任何日期的 weekstart_date。这有很大关系。事实上,他可以简单地调用SELECT * FROM [MyDB].[dbo].[udfCommonDates] (GetDate())
或调用SELECT get_week_start FROM [MyDB].[dbo].[udfCommonDates] (GetDate())
并加载或加入该表。
哦,我的错,我没看到这个。是的,你是对的,这是解决这个问题的一个非常优雅的解决方案。
表格中缺少他们需要的日期。如果表格中没有该周的日期,get_week_start
函数将如何提供帮助?
【参考方案1】:
使用您的数据,可能最简单的方法是:
select distinct weekstart_date
from t
union
select distinct dateadd(day, 7, weekstart_date)
from t;
您似乎永远不会错过超过一周的时间,因此将每周与下一周结合起来似乎就足够了。
【讨论】:
与联合不同?这会让它更加与众不同吗? @JamieD77 - 需要联合来提取查询的其余部分。没有它,这是行不通的。 @这是真的 JonH,但 UNION 使结果集与众不同.. 只是想知道 2 个额外的不同之处是否有助于做一些我不知道的事情 @JamieD77 。 . .有趣的观察。它的存在有两个原因。首先,第一个子查询可以使用列上的索引。其次,考虑到distinct
的性能特征,减少每个表的数据量可以提高性能。然而,在这种情况下,这(很可能)是一个非常小的收益。【参考方案2】:
如果间隔超过 1 周,您可以使用递归 cte 执行此操作。
WITH WeeklyCTE AS
(
SELECT MIN(weekstart_date) AS weekstart_date
FROM MyTable
UNION ALL
SELECT DATEADD(week, 1, weekstart_date)
FROM WeeklyCTE
WHERE DATEADD(week, 1, weekstart_date) <= GETDATE()
)
SELECT t.reportdate,
w.weekstart_date
FROM WeeklyCTE w
LEFT JOIN MyTable t ON w.weekstart_date = t.weekstart_date
【讨论】:
以上是关于sql获取两个日期之间的每周开始日期的主要内容,如果未能解决你的问题,请参考以下文章
SQL 'overlaps' 仅获取开始和结束之间的日期(不包括开始和结束日期)