【问题标题】:how to create list of unique dates from a date range如何从日期范围创建唯一日期列表
【发布时间】:2017-05-22 18:49:54
【问题描述】:

我有数以千计的汽车旅馆访问日期记录,如表 A:

  Name                 CheckInDate           CheckOutDate
  Pete                  11/1/2016            11/1/2016
  Mike                  11/1/2016            11/2/2016
  Don                   11/1/2016            11/3/2016

需要创建查询来为客人的每个访问日期生成一个具有唯一条目的临时表。像这样:

 Name                        VisitDate
 Pete                        11/1/2016
 Mike                        11/1/2016
 Mike                        11/2/2016
 Don                         11/1/2016
 Don                         11/2/2016
 Don                         11/3/2016

这个让我难过。我非常感谢你的帮助!

【问题讨论】:

    标签: sql sql-server tsql datetime


    【解决方案1】:

    计数/日历表是最佳选择,但您可以通过与 CROSS APPLY 配合使用的临时计数表来执行此操作,如下所示:

    示例

    Select A.[Name] 
          ,VisitDate = B.D
     From  YourTable A
     Cross Apply (
                    Select Top (DateDiff(DD,[CheckInDate],[CheckOutDate])+1) D=DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),[CheckInDate]) 
                     From  master..spt_values n1
                 ) B
    

    退货

    Name    VisitDate
    Pete    2016-11-01
    Mike    2016-11-01
    Mike    2016-11-02
    Don     2016-11-01
    Don     2016-11-02
    Don     2016-11-03
    

    编辑 - 如果您有(或想要)一个 DateTable

    Select A.[Name] 
          ,VistiDate = B.[Date]
     From  YourTable A
     Join  YourDateTable B
      on   B.[Date] between A.[CheckInDate] and A.[CheckOutDate]
    

    【讨论】:

    • 嗨,约翰。这太棒了。从您的示例中,我将“您的表”更改为我给出的示例中的第一个源表。我也按原样离开了“master..spt_values”。它开始产生结果,然后立即切换到错误“TOP 或 FETCH 子句包含无效值”。有什么想法吗?
    • @inefficientmkts 我怀疑是数据问题。 CheckIn 或 CheckOut 中的 NULLS 吗? CheckOut 少于 CheckIn?
    • @inefficientmkts 是的,你得到了 NULL。通过强制一个空值,我能够创建你的错误。
    • 现在效果很好!!我不能感谢你!说真的......让我很开心。我将了解有关交叉应用的更多信息。这对我来说是新的领域。
    • @inefficientmkts 很高兴它有帮助。 ... 只需要一个 :)
    【解决方案2】:

    你可以只使用联合

    select name, checkindate as visitdate from guests
     union
    select name, checkoutdate as vistidate from guests
    

    Union 也会处理 distinct

    【讨论】:

    • 据我了解,OP 希望每个访问者的所有日期列表从 CheckInDateCheckOutDate
    • 哦,我没注意到
    猜你喜欢
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多