【问题标题】:SQL Union as Subquery to create Date Ranges from Start DateSQL Union 作为子查询从开始日期创建日期范围
【发布时间】:2020-02-27 17:44:03
【问题描述】:

我有三个表格,每个表格都有一个日期列(日期列是一个 INT 字段,需要保持这种状态)。我需要一个跨所有三个表的 UNION 以便我得到按升序排列的唯一日期列表,如下所示:

20040602  
20051215  
20060628  
20100224  
20100228  
20100422  
20100512  
20100615 

然后我需要在查询结果中添加一列,从每个日期中减去一列,并将其放在上方一行作为结束日期。基本上我需要以某种方式从开始日期生成结束日期,这就是我到目前为止得到的(不工作):

With Query1 As (
    Select date_one As StartDate
    From table_one
     Union
     Select date_two As StartDate
     From table_two
     Union
     Select date_three e As StartDate
     From table_three
     Order By Date Asc
     )
Select Query1.StartDate - 1 As EndDate
From Query1

非常感谢您的帮助!

【问题讨论】:

  • 您确定该列是 Date 或 DateTime 数据类型,而不是 INT?
  • 我认为您的查询甚至不会运行。您不能在 CTE 中使用 ORDER BY
  • @HardCode 都是正确的,它是一个 int 字段,查询还没有工作。
  • -1 因为“他们每个人都有一个日期列”,然后是同一作者的评论说:“这是一个 int 字段”......有人为此发明了一个“编辑”选项!跨度>
  • @Luuk 你是对的,对不起。我已经通过帖子进行了编辑。

标签: sql sql-server tsql date union


【解决方案1】:

在您现有的union cte 的基础上,我们可以在外部查询中使用lead() 来获取下一条记录的start_date,并从中撤回1

with q as (
    select date_one start_date  from table_one
    union select date_two from table_two
    union select date_three from table_three
)
select 
    start_date,
    dateadd(day, -1, lead(start_date) over(order by start_date)) end_date
from q
order by start_date

如果原始列的数据类型是数字,那么您需要在应用日期函数之前进行一些转换:

with q as (
    select cast(cast(date_one as varchar(8)) as date) start_date  from table_one
    union select cast(cast(date_two as varchar(8)) as date) from table_two
    union select cast(cast(date_three as varchar(8)) as date) from table_three
)
select 
    start_date,
    dateadd(day, -1, lead(start_date) over(order by start_date)) end_date
from q
order by start_date

【讨论】:

  • 这里唯一需要注意的是返回一个无效的结束日期。由于 OP 声明它是一个整数列,如果您的 start_date 是 20200301,您可以返回类似 20200300 作为 end_date 的内容。不确定要求是什么,但这可能意味着转换为日期字段,执行 dateadd 操作以删除day 然后转换回一个 int 字段。
  • @ChadEstes:是的,我刚刚在评论中看到了这一点,并通过额外的演员更新了我的答案。
  • @GMB 谢谢!它工作得很好。唯一的问题是最后我需要它作为 int 像这样的“20040602” - 我如何将它转换回来?
  • 可以使用format(start_date,'yyyyMMdd') FORMAT 将此日期转换回来
猜你喜欢
  • 1970-01-01
  • 2020-12-23
  • 2022-01-13
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多