PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

strftime in sqlite in postgres konvertieren

Dieses SQLite:

date(date, '-' || strftime('%w', date) || ' days')

Ist, AFAIK, das Subtrahieren der Wochentage (d. h. 0 für Sonntag, 1 für Montag, ...) von date und dann das Ergebnis zurück in ein date umzuwandeln; siehe Referenz zur Datumsfunktion für Details.

Ich denke, das Äquivalent für PostgreSQL wäre:

d - extract(dow from d)::int

wobei d ist dein Datum; Subtrahieren einer Ganzzahl von einem Datum subtrahiert diese Anzahl von Tagen. Wenn d ein Zeitstempel ist, müssen Sie möglicherweise etwas Casting hinzufügen. Es gibt date_trunc('week ', 'd') auch, aber das beginnt mit der Zählung der Tage ab Montag, also wärst du damit um eins dran.

Hier ist eine kurze Aufschlüsselung des SQLite mit dem date Variable ersetzt durch d um Verwechslungen mit dem date() zu vermeiden Funktion:

date(d, '-' || strftime('%w', d) || ' days')

Zuerst || ist der Standard-SQL-String-Verkettungsoperator. Der strftime Funktion ist ein Allzweckformatierer für Datum und Uhrzeit, der von POSIX stammt; der %w Formatbezeichner bedeutet "Wochentag als Zahl, wobei Sonntag Tag Null ist"; also die strftime call gibt Ihnen 0 für Sonntag, 1 für Montag usw. bis zu 6 für Samstag. Wenn d ein Dienstag ist, dann ist die strftime Aufruf ergibt 2 und das Ganze endet als:

date(d, '-2 days')

Die Modifikatoren für das SQLite date Funktion haben verschiedene Formen, aber '-2 Tage' bedeutet genau das, was Sie denken würden:subtrahieren Sie zwei Tage von d . Das Gesamtergebnis ist, dass Sie d erhalten auf die Woche gekürzt (wobei Sonntag als erster Tag der Woche gilt).

Auf der PostgreSQL-Seite:

d - extract(dow from d)::int

wir können mit extract ; extrahieren wird verwendet, um bestimmte Teile eines Datums oder einer Uhrzeit und dow zu extrahieren bedeutet "Wochentag als Zahl mit Sonntag als Tag Null". Klingt bekannt? Dann der ::int wandelt die DOW-Zahl in eine Ganzzahl um und wird benötigt, da die DOW tatsächlich als Wert mit doppelter Genauigkeit ausgegeben wird und kein Operator definiert ist, um ein Double von einem Datum in PostgreSQL zu subtrahieren; der Cast kann auch in der Standardform als cast(x as int) geschrieben werden . Wenn Sie in PostgreSQL eine Ganzzahl von einem Datum subtrahieren, subtrahieren Sie so viele Tage; Sie können expliziter sein, indem Sie Dinge wie - interval '3 days' sagen aber das würde in diesem Fall nur mehr Lärm verursachen, also habe ich mich für Einfachheit entschieden. Wenn es Dienstag ist, sieht unsere PostgreSQL-Version so aus:

d - 2

und das ist dasselbe wie:

d - interval '2 days'

Und nach der Subtraktion wären wir am Sonntag wieder da. Es gibt auch date_trunc in PostgreSQL, aber das würde auf Montag und nicht auf Sonntag kürzen.