2016-06-08 4 views
1

Genau was die Frage sagt.Warum gibt postgres date_trunc die Stunde 24 zurück?

mydb=> select '2016-01-03 24:00'::timestamp; 
     timestamp 
--------------------- 
2016-01-04 00:00:00 
(1 row) 

Das habe ich erwartet.

mydb=> select date_trunc('seconds', '2016-01-03 23:59.9999999999'::timestamp); 
    date_trunc 
--------------------- 
2016-01-03 00:24:00 
(1 row) 

Um. Warte was?

+1

'23: 59.9999999999' sind 23 Minuten und 59,999 Sekunden .... – tkausl

+0

mit anderen Worten, Ihre "um Warte" Version vergessen, die Stunden anzugeben. –

+0

Ja. Aber das sollte in "2016-01-04 00: 00" übergehen. Es gibt keine Zeit wie 24: 00. Es verhält sich für "Mikrosekunden" gleich. –

Antwort

4

Es hat nichts mit date_trunc zu tun ... sobald Sie den Dezimalpunkt eingeführt haben, wird 23:59.9999999999 als Minuten und Sekunden und nicht als Stunden und Minuten interpretiert.

Ohne Dezimalpunkt

db=# select '2016-01-03 23:59'::timestamp; 
     timestamp  
--------------------- 
2016-01-03 23:59:00 
(1 row) 

mit Komma-

db=# select '2016-01-03 23:59.9999999'::timestamp; 
     timestamp  
--------------------- 
2016-01-03 00:24:00 
(1 row) 

Es ist verständlich, gegeben, was Sie zurück zu bekommen erwarteten, aber Sie scheinen bis 24 Minuten falsch verstanden zu haben, wie 24 Stunden im Ergebnis hier.

Als Randnotiz, in der Rundung Kicks, wenn Sie sechs Ziffern gehen vorbei (das heißen Mikrosekunden) nach dem Komma:

db=# select '2016-01-03 23:59.999999'::timestamp; 
     timestamp   
---------------------------- 
2016-01-03 00:23:59.999999 
(1 row) 
+0

Ich habe * gerade * erkannt, dass ich das '23: 59: 59.99999': P brauchte –

Verwandte Themen