SQL Union作为子查询从开始日期创建日期范围
我有三个选项卡,每个选项卡都有一个日期列(日期列是一个INT字段,需要保持这种状态)。我需要一个跨所有三个表的联合帐户,以便按如下顺序获得唯一日期的列表:SQL Union作为子查询从开始日期创建日期范围,sql,sql-server,tsql,date,union,Sql,Sql Server,Tsql,Date,Union,我有三个选项卡,每个选项卡都有一个日期列(日期列是一个INT字段,需要保持这种状态)。我需要一个跨所有三个表的联合帐户,以便按如下顺序获得唯一日期的列表: 20040602 20051215 20060628 20100224 20100228 20100422 20100512 20100615 然后我需要在查询结果中添加一列,从每个日期中减去一列,并将其放在上面一行作为结束日期。基本上,我需要以某种方式从开始日期生成结束日期,这就是我到目前为止得到的结果(不起
20040602
20051215
20060628
20100224
20100228
20100422
20100512
20100615
然后我需要在查询结果中添加一列,从每个日期中减去一列,并将其放在上面一行作为结束日期。基本上,我需要以某种方式从开始日期生成结束日期,这就是我到目前为止得到的结果(不起作用):
非常感谢你的帮助 基于您现有的
联合
cte,我们可以在外部查询中使用lead()
获取下一条记录的开始日期
,并从中提取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
您确定列是日期或日期时间数据类型,而不是INT吗?我认为您的查询甚至不会运行。您不能在CTE中使用
ORDER BY
。@HardCode两者都是正确的,它是一个int字段,并且查询还不能工作。-1因为“它们每个都有一个日期列”,后面跟着同一作者的注释:“这是一个int字段”。。。。有人为此发明了“编辑”选项@卢克,你说得对,对不起。我已经通过post编辑了。这里唯一让人厌烦的是返回一个无效的结束日期。由于OP声明它是一个整数列,如果开始日期为20200301,则可以返回类似20200300的值作为结束日期。不确定要求是什么,但这可能意味着转换为日期字段,执行dateadd操作删除日期,然后转换回int字段。@ChadEstes:是的,我在评论中读到了,并用附加的强制转换更新了我的答案。@GMB谢谢!它工作得很好。唯一的问题是,最后我需要像“20040602”这样的int格式-如何将其转换回?可以使用格式(start_date,'yyyyymmdd')
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