dividir una sola fila en múltiples filas en SQL

En mi tabla hay dos campos de inicio y finalización que almacena la hora de inicio y la hora de finalización, respectivamente.

por ejemplo, la hora de inicio = 2014-01-01 23:43:00 y stop = 2014-01-03 03:33:00. Esta timestamp necesita separarse de.

1=> 2014-01-01 23:43:00 - 2014-01-02 00:00:00, as date 2014-01-01 2=> 2014-01-02 00:00:01 - 2014-01-03 00:00:00, as date 2014-01-02 3=> 2014-01-03 00:00:01 - 2014-01-03 03:33:00, as date 2014-01-03 

como tres filas diferentes.

Aquí el problema es que la diferencia en la hora de inicio y finalización varía de 1 día a 10 días.

Para hacerlo más complicado, en el ejemplo anterior, divido el período en function de la date, esto necesito dividirlo en function del time, es decir. decir dividir a la hora 02:30:00, por lo que la escupida debe ser como sigue.

 1=> 2014-01-01 23:43:00 - 2014-01-02 02:30:00, as date 2014-01-01 2=> 2014-01-02 02:30:01 - 2014-01-03 02:30:00, as date 2014-01-02 3=> 2014-01-03 02:30:01 - 2014-01-03 02:30:00, as date 2014-01-03 4=> 2014-01-03 02:30:01 - 2014-01-03 03:33:00, as date 2014-01-04 

Una vez que se haya realizado la split anterior, necesito contar las filas agrupadas por date.

Estoy usando PostgreSQL .

¿Alguien puede arrojar algo de luz sobre esto?

¡Gracias!

Creo que su muestra de salida deseada "dividida por time" es incorrecta y debería ser en cambio esta

 1=> 2014-01-01 23:43:00 - 2014-01-02 02:30:00, as date 2014-01-01 2=> 2014-01-02 02:30:01 - 2014-01-03 02:30:00, as date 2014-01-02 3=> 2014-01-03 02:30:01 - 2014-01-03 03:33:00, as date 2014-01-03 

Si ese es el caso, entonces hazlo

 select day, count(*) from ( select generate_series( (start_time - interval '2 hours 30 minutes')::date, stop_time, interval '1 day' )::date as day from t ) s group by day order by day 

Cree una tabla de queueteral: period e inserte todos los períodos posibles en la tabla, digamos from now() -10 years to now()+10 years .

En el caso de días, debe ser todos los días de los 20 años.

Después de eso, puede seleccionar de la tabla de period y UNIRSE a su tabla con el código de extracción de períodos

Probablemente necesitará una tabla adicional que contenga cada date para unirla a su tabla base.

Si tuviera una tabla como dates contenga valores como:

 date_col 2014-01-01 00:00:00 2014-01-02 00:00:00 2014-01-03 00:00:00 ... 

Entonces puedes hacer una consulta como

 SELECT GREATEST(start_time, date_col), LEAST(end_time,date_col + interval 1 day) FROM base_table JOIN dates ON date_col BETWEEN start_time AND end_time 

SQL no probado, pero muestra la idea.