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

SQL SERVER:获取两个日期之间的总天数

SQL 'overlaps' 仅获取开始和结束之间的日期(不包括开始和结束日期)

sql server 中两个日期之间的年份以及每个日期在 sql server 中的开始和结束日期

尝试使用 SQL 在 PHP 中获取两个日期之间的日期

PHP获取一年有几周以及每周开始日期和结束日期