Ist das ernsthaft POSTGRES-Syntax?

Ich bin auf der Suche nach den Wochenenden einberechnen auf auf diese Seite gestoßen.
Wenn ich die Syntax mir da anschaue erscheint sie mir nicht ganz die Syntax zu sein, die ich auf dieser DokuSeite finde.
Handelt sich es hier um einen Aufsatz auf das PostgresSQL?
Sorry diese Frage ist sicher eine Noobi-Frage, andererseits bin ich ja auch ein Noob :slight_smile:

Da fehlt ein bisschen Syntax drumrum. Im weiterführenden Link stehen ein paar Ideen dazu. Ist zwar SQL-Server, sollte sich aber auch sinngemäß umsetzen lassen.

Gruß Uwe

Die erste Abfrage ist für Amazon Redshift. Die zweite Abfrage verwendet zwar Postgres Funktionen, aber z.B. dieser Ausdruck: [[end_date]:week]::timestamp ist völlig falsch. Einerseits wegen den eckigen Klammer andererseits macht :week keinen Sinn. Selbst wenn es ein Cast sein soll (::week) wäre es falsch, weil es keinen Datentyp week gibt. Das soll vermutlich komplett für Redshift sein. Redshift “tut” so als wäre es eine Postgres Datenbank, ist es aber nicht.

Das Ganze sieht ziemlich konfus aus. Die Anzahl der Tage zwischen zwei Datumswerten kann man viel leichter mit end_date::date - start_date::date berechnen. Da muss man nicht auf date_part() zurückgreifen (was meistens auch noch einen falschen Wert liefert). Damit kann man die Redshift Logik vermutlich etwas vereinfachen.

Ich glaube, das hier sollte das Gleiche berechnen, aber mit valider Syntax für Postgres:

(end_date::date - start_date::date) - (end_date::date - start_date::date)/7*2
  - CASE WHEN EXTRACT (dow from start_date NOT IN (0) THEN EXTRACT (dow from start_date) - 1 ELSE 5 END)
  + CASE WHEN EXTRACT (dow from end_date NOT IN (0) THEN EXTRACT (dow from end_date) - 1 ELSE 5 END) 

Eine etwas einfachere Lösung des Problems “Anzahl Tage zwischen zwei Datumswerten ohne Wochenende” gibt es z.B. hier: Counting days excluding weekends in PostgreSQL - Stack Overflow

Danke für die Umsetzung, aber irgendwie stehe ich noch immer auf dem Schlauch wie ich das dann tatsächlich verwende.
Innerhalb eines Selects, scheiterten meine bisherigen Verusche auch mit konkreten Datumsangaben wie z.B. ‘2022-02-28’:date

select ('2022-02-28'::date- '2022-02-01'::date) - ('2022-02-01'::date - '2022-02-28'::date)/7*2
  - CASE WHEN EXTRACT (dow from start_date NOT IN (0) THEN EXTRACT (dow from start_date) - 1 ELSE 5 END)
  + CASE WHEN EXTRACT (dow from end_date NOT IN (0) THEN EXTRACT (dow from end_date) - 1 ELSE 5 END)

Fehler:
ERROR: FEHLER: Syntaxfehler bei »THEN«
LINE 2: …CASE WHEN EXTRACT (dow from start_date NOT IN (0) THEN EXTRA…

SQL state: 42601

Die Klammern waren falsch:

with test_data(start_date, end_date) as (
  values 
    ('2022-01-05'::date, '2022-01-12'::date),
    ('2022-01-10', '2022-01-14')
)
select start_date, end_date,
      (end_date::date - start_date::date) - (end_date::date - start_date::date)/7*2
        - CASE WHEN EXTRACT (dow from start_date) NOT IN (0) THEN EXTRACT (dow from start_date) - 1 ELSE 5 END
        + CASE WHEN EXTRACT (dow from end_date) NOT IN (0) THEN EXTRACT (dow from end_date) - 1 ELSE 5 END 
from test_data
1 „Gefällt mir“

Cool, der Aspekt mit den Testdaten. Ja der Anfänger staunt über solche Möglichkeiten :smiley:
Mal abgesehen, dass das Ergebnis nicht so richtig zu sein scheint :upside_down_face:

2022-01-05 2022-01-12 5
2022-01-10 2022-01-14 8

Ich habe ja nie behauptet, dass die Lösung korrekt ist. Ich habe nur versucht, die konfuse Orginal-Syntax in etwas zu übersetzen was in Postgres lauffähig ist.

war ja auch nicht böse gemeint, fand aber den für mich neuen Aspekt echt super!

Dieses Thema wurde automatisch 60 Tage nach der letzten Antwort geschlossen. Es sind keine neuen Antworten mehr erlaubt.