Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Union作为子查询从开始日期创建日期范围_Sql_Sql Server_Tsql_Date_Union - Fatal编程技术网

SQL Union作为子查询从开始日期创建日期范围

SQL Union作为子查询从开始日期创建日期范围,sql,sql-server,tsql,date,union,Sql,Sql Server,Tsql,Date,Union,我有三个选项卡,每个选项卡都有一个日期列(日期列是一个INT字段,需要保持这种状态)。我需要一个跨所有三个表的联合帐户,以便按如下顺序获得唯一日期的列表: 20040602 20051215 20060628 20100224 20100228 20100422 20100512 20100615 然后我需要在查询结果中添加一列,从每个日期中减去一列,并将其放在上面一行作为结束日期。基本上,我需要以某种方式从开始日期生成结束日期,这就是我到目前为止得到的结果(不起

我有三个选项卡,每个选项卡都有一个日期列(日期列是一个INT字段,需要保持这种状态)。我需要一个跨所有三个表的联合帐户,以便按如下顺序获得唯一日期的列表:

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