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.