Ich suche nach einer Möglichkeit, die SQLServer-Funktion dateiff in PostgreSQL zu implementieren . Das ist,
Diese Funktion gibt die Anzahl (als vorzeichenbehafteten ganzzahligen Wert) der angegebenen Datumsteilgrenzen zurück, die zwischen dem angegebenen Start- und Enddatum überschritten wurden.
datediff(dd, '2010-04-01', '2012-03-05') = 704 // 704 changes of day in this interval
datediff(mm, '2010-04-01', '2012-03-05') = 23 // 23 changes of month
datediff(yy, '2010-04-01', '2012-03-05') = 2 // 2 changes of year
Ich weiß, ich könnte 'dd' machen, indem ich einfach Subtraktion benutze, aber eine Idee über die anderen beiden?
postgresql
date
gefei
quelle
quelle
Antworten:
Dies gibt Ihnen volle Jahre, Monate, Tage ... zwischen zwei Daten:
Detailliertere Informationen zum Datum .
quelle
select date_part('month', age('2010-04-01', '2012-03-05'));
gibt-11
. Das ist kein korrekter Unterschied in MonatenSELECT date_part('day', age('2016-10-05', '2015-10-02'))
zurückgegeben3
age()
wird immer falsch sein, um dies für Jahre und Monate zu tun. Zwischen2014-12-31
und2015-01-01
vor wird 0 für Monat und Jahr geben, währenddatediff()
1 und 1 gegeben werden. Sie können nicht einfach eins zumage()
Ergebnis hinzufügen, daage()+1
zwischen2015-01-01
und 1 1 ergibt2015-01-02
, währenddatediff()
jetzt 0 ergibt.Subtrahieren Sie sie einfach:
Das Ergebnis:
quelle
range_end - range_start ASC, id DESC
interval
, der nicht einfach als umgewandelt werden kannint
. Wie konvertiere ich ein Intervall mit Postgres in mehrere Stunden? . Die Verwendung vondate_part
/age
Funktion kombiniert, wie in @IgorRomanchenko ‚s Antwort erwähnt wird Typen zurückgebendouble precision
date_part
/age
Antwort, wie akzeptiert, Tage als Differenz zwischen den Tagen der beiden Daten angibt.date_part('day', age('2016-9-05', '2015-10-02'))
kehrt zurück 3.Ich habe einige Zeit damit verbracht, nach der besten Antwort zu suchen, und ich glaube, ich habe sie.
Diese SQL gibt Ihnen die Anzahl der Tage zwischen zwei Daten als
integer
:..was, wenn heute (
2017-3-28
) ausgeführt, bietet mir:Das Missverständnis über die akzeptierte Antwort:
..ist, dass Sie den wörtlichen Unterschied zwischen den Teilen der Datumszeichenfolgen erhalten, nicht die Zeitspanne zwischen den beiden Datumsangaben.
IE:
Age(interval)=-1 years -11 mons -4 days;
Years(double precision)=-1;
Months(double precision)=-11;
Days(double precision)=-4;
quelle
Fast die gleiche Funktion, die Sie benötigt haben (basierend auf der Antwort von atiruz, verkürzte Version von UDF von hier )
Verwendung:
quelle
DATEDIFF()
Funktion in MS SQL gibt1
für zurückdatediff(year, '2015-02-14', '2016-01-03')
. Dies liegt daran, dass Sie die JahresgrenzeErgebnis: 6
quelle
Diese Frage ist voller Missverständnisse. Lassen Sie uns zunächst die Frage vollständig verstehen. Der Fragesteller hat will das gleiche Ergebnis wie bekommen , wenn die Lauf MS SQL Server - Funktion
DATEDIFF ( datepart , startdate , enddate )
, wodatepart
nimmtdd
,mm
oderyy
.Diese Funktion ist definiert durch:
Das heißt, wie viele Tages-, Monats- oder Jahresgrenzen überschritten werden. Nicht wie viele Tage, Monate oder Jahre es zwischen ihnen ist. Deshalb
datediff(yy, '2010-04-01', '2012-03-05')
ist 2 und nicht 1. Zwischen diesen Daten liegen weniger als 2 Jahre, was bedeutet, dass nur 1 ganzes Jahr vergangen ist, aber 2 Jahre Grenzen überschritten haben, von 2010 bis 2011 und von 2011 bis 2012.Das Folgende ist mein bester Versuch, die Logik korrekt zu replizieren.
quelle
Ich möchte die Antwort von Riki_tiki_tavi erweitern und die Daten dort herausbringen. Ich habe eine datierte Tiff-Funktion erstellt, die fast alles macht, was SQL Server macht. Auf diese Weise können wir jede Einheit berücksichtigen.
quelle
Hier ist ein vollständiges Beispiel mit Ausgabe. psql (10.1, Server 9.5.10).
Sie erhalten 58, nicht einen Wert unter 30.
Entfernen Sie die Funktion age (), um das im vorherigen Beitrag erwähnte Problem zu lösen.
quelle
Eine weitere Lösung, Version für den Unterschied der Jahre:
(1 Reihe)
Und der gleiche Trick für die Monate:
(1 Reihe)
In der realen Abfrage kann es einige Zeitstempelsequenzen geben, die nach Stunde / Tag / Woche / usw. anstelle von generate_series gruppiert sind.
Dies
'count(distinct(date_trunc('month', ts)))'
kann direkt auf der linken Seite der Auswahl verwendet werden:Ich habe hier nur der Kürze halber generate_series () verwendet.
quelle
Die Antwort von @WebWanderer kommt dem DateDiff mit SQL Server sehr nahe, ist aber ungenau. Dies liegt an der Verwendung der Funktion age ().
zB Tage zwischen '2019-07-29' und '2020-06-25' sollten 332 zurückgeben. Bei Verwendung der Funktion age () werden jedoch 327 zurückgegeben. Da age () '10 mons 27 Tage 'zurückgibt und behandelt wird jeden Monat als 30 Tage, was falsch ist.
Sie sollten den Zeitstempel verwenden, um das genaue Ergebnis zu erhalten. z.B
ceil((select extract(epoch from (current_date::timestamp - <your_date>::timestamp)) / 86400))
quelle