2014-03-12 47 views
1

我有一个具有列开始时间和停止时间的表。将行拆分成表的多个行

例如

Start time   Stop Time 
2014-01-01 23:43:00 2014-01-02 03:33:00 

这我需要在分裂到2014年1月1日23点43分零零秒 - 2014年1月2日00:00:00和2014年1月2日00:00 :00 - 2014-01-02 03:33:00作为两个单独的行。

+1

您希望为所有行完成此操作,还是仅针对那些开始时间和停止时间与上述数据不同的日期的行? –

+0

我需要它的所有行! – DJo

+1

最后一次划分是否正确?你想从停止时间减去一天吗? – Mihai

回答

0
select 
    if (temp.row_n=1,t.start_time,t.stop_time) as time 
from mytable t, 
    (select 1 as row_n 
     union 
     select 2 as row_n) temp 
+0

执行后出现错误ERROR:function if(布尔型,没有时区的时间戳,没有时区的时间戳)不存在 提示:没有函数匹配给定的名称和参数类型。您可能需要添加明确的类型转换。 ' – DJo

+0

@dhanishjose你添加了mysql标签,但显然这是另一个分区 – StanislavL

1

可以打破两列到各行,然后使用CASE语句,就像这样:

select 
    CASE WHEN t.timetype=1 THEN mytime 
     WHEN t.timetype=2 THEN CONCAT(DATE(mytime), ' 00:00:00') 
    END as starttime, 
    CASE WHEN t.timetype=1 THEN CONCAT(DATE_ADD(DATE(mytime), INTERVAL 1 DAY), ' 00:00:00') 
     WHEN t.timetype=2 THEN mytime 
    END as stoptime 
from (
    select starttime as mytime, 1 as timetype from record 
    union 
    select stoptime as mytime, 2 as timetype from record 
) t 

工作演示http://sqlfiddle.com/#!2/7ef31/30

这里表t将有2你的Records表的每一行的行,一行将包含starttime,而另一行将包含stoptime 。表t的每一行还将包含一个type。类型1为starttime,类型2为stoptime。然后CASE声明将用于生成您所需的数据。

+0

你已经共享的上述脚本只能在我提到的exampled中工作,可以有一些情况,开始和结束日期的差异从1天,2天,3天......等等(假设最大差异为10天)。 – DJo

+0

请检查[**这个**](http://stackoverflow.com/questions/22398982/split-single-row-into-multiple-rows-in-sql)我让我的需求更复杂。 – DJo