2016-08-04 14 views
0

Ich habe eine Tabelle ‚ad‘ in meinem Postgres DB, enthalten ‚start‘ und ‚end‘ Spalten wie:Wie partitionieren Sie die Zeitstempeldauer in mehreren Zeilen mit PostgreSQL 9.5?

ID  Start     End 
1   2003-06-07 00:00:00  2004-09-30 23:59:59 

Wie kann ich diese Dauer brechen (2003-2004) in zwei Teilen, so dass die Start- und Enddaten (Zeitstempel) sollten im selben Jahr so ​​bleiben?

ID  Start     End 
1_2003  2003-06-07 00:00:00  2003-12-31 23:59:59 
1_2004  2004-01-01 00:00:00  2004-09-30 23:59:59 

Ich habe mich gefragt, ob Fensterfunktion hilfreich wäre, um dies zu erreichen? Ich benutze PostgreSQL Version 9.5 (x64).

Antwort

1

Beispieldaten:

create table ad (id text, start_t timestamp, end_t timestamp); 
insert into ad values 
(1, '2003-06-07 00:00:00', '2004-09-30 23:59:59'), 
(2, '2002-02-02 00:00:00', '2004-04-04 23:59:59'); 

Abfrage:

select 
    concat(id, '_', y) id, 
    case 
     when extract(year from start_t)::int = y then start_t 
     else make_timestamp(y, 1, 1, 0, 0, 0) end as "start", 
    case 
     when extract(year from end_t)::int = y then end_t 
     else make_timestamp(y, 12, 31, 23, 59, 59) end as "end" 
from 
    ad, 
    generate_series(extract(year from start_t)::int, extract(year from end_t)::int) y; 

    id |  start  |   end   
--------+---------------------+--------------------- 
1_2003 | 2003-06-07 00:00:00 | 2003-12-31 23:59:59 
1_2004 | 2004-01-01 00:00:00 | 2004-09-30 23:59:59 
2_2002 | 2002-02-02 00:00:00 | 2002-12-31 23:59:59 
2_2003 | 2003-01-01 00:00:00 | 2003-12-31 23:59:59 
2_2004 | 2004-01-01 00:00:00 | 2004-04-04 23:59:59 
(5 rows) 
+0

Thank you! Was ist, wenn die Spalten 'Start' und 'Ende' in meiner Postgres-Datenbank anfänglich als Textzeichenfolge gespeichert sind, d. H. Zeichenvariation (20) & alpha; Muss ich ihren Datentyp vorher CAST? –

+1

Sie sollten Varchar in Timestamp umwandeln, unter der Annahme, dass die Varchar-Werte natürlich ein korrektes Format haben. Ich würde vorschlagen, die Spaltentypen in der Tabelle zu ändern, um das Leben in der Zukunft zu erleichtern. – klin

+0

Für Ihre Beispieldaten funktionierte die Abfrage gut. Aber für meine Daten bekomme ich ERROR: Spaltenreferenz "y" ist mehrdeutig. Kannst du mir sagen warum? Ich habe die Spaltentypen mit der Funktion to_timestamp() in den Zeitstempel geändert. –