【问题标题】:sql get every week start date between two datessql获取两个日期之间的每周开始日期
【发布时间】:2016-01-29 18:23:49
【问题描述】:

我有一个包含这些数据的表 员工reported 的日期和那一周的start date(星期一)。 现在他们没有工作所有的日期,例如圣诞节的那一周没有数据。 有没有办法可以添加缺少的一周。所以,我仍然会有每周的一周开始日期。但报告日期可以为空。

我不能声明变量。

【问题讨论】:

  • @JonH 我认为链接与问题无关。
  • @haytem - 你一定没有读过它......标量值函数允许他调用以获取任何日期的 weekstart_date。这有很大关系。事实上,他可以简单地调用SELECT * FROM [MyDB].[dbo].[udfCommonDates] (GetDate()) 或调用SELECT get_week_start FROM [MyDB].[dbo].[udfCommonDates] (GetDate()) 并加载或加入该表。
  • 哦,我的错,我没看到这个。是的,你是对的,这是解决这个问题的一个非常优雅的解决方案。
  • 表格中缺少他们需要的日期。如果表格中没有该周的日期,get_week_start 函数将如何提供帮助?

标签: sql sql-server


【解决方案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

【讨论】:

    猜你喜欢
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 2014-10-12
    • 1970-01-01
    • 2019-11-02
    • 2013-02-10
    • 1970-01-01
    相关资源
    最近更新 更多