Heim > Datenbank > MySQL-Tutorial > Wie berechnet man Datumsangaben ohne Berücksichtigung des Jahres in SQL?

Wie berechnet man Datumsangaben ohne Berücksichtigung des Jahres in SQL?

DDD
Freigeben: 2025-01-05 07:48:40
Original
138 Leute haben es durchsucht

How to Calculate Dates Ignoring the Year in SQL?

So führen Sie Datumsberechnungen durch, bei denen das Jahr mit SQL ignoriert wird

Problem:

Sie möchten Datumsangaben auswählen, die Folgendes haben ein Jubiläum innerhalb der nächsten 14 Tage, aber Sie möchten dies erreichen, indem Sie das Jahr ausschließen.

Beispiel Abfrage:

SELECT *
FROM events
WHERE EXTRACT(month FROM "date") = 3
AND EXTRACT(day FROM "date") < EXTRACT(day FROM "date") + 14;
Nach dem Login kopieren

Herausforderung:

Die obige Abfrage funktioniert nicht, da sie den Wrap-Around-Effekt von Monaten nicht berücksichtigt.

Lösungen:

1. Erweiterte Version

Diese Lösung verwendet eine benutzerdefinierte SQL-Funktion und einen mehrspaltigen Index für optimale Leistung.

CREATE OR REPLACE FUNCTION f_mmdd(date)
  RETURNS int LANGUAGE sql IMMUTABLE PARALLEL SAFE STRICT AS
'SELECT EXTRACT(month FROM )::int * 100 + EXTRACT(day FROM )::int';

CREATE INDEX event_mmdd_event_date_idx ON event(f_mmdd(event_date), event_date);

SELECT *
FROM event e
WHERE f_mmdd(e.event_date) BETWEEN f_mmdd(current_date)
                            AND f_mmdd(current_date + 14);
Nach dem Login kopieren

2. Tabellenfunktion

Diese Lösung verwendet eine PostgreSQL-Tabellenfunktion, um die Jubiläumsberechnung durchzuführen.

CREATE OR REPLACE FUNCTION f_anniversary(_the_date date = current_date, _days int = 14)
  RETURNS SETOF event
  LANGUAGE plpgsql AS
$func$
DECLARE
   d  int := f_mmdd();
   d1 int := f_mmdd( +  - 1);  -- fix off-by-1 from upper bound
BEGIN
   IF d1 > d THEN
      RETURN QUERY
      SELECT *
      FROM   event e
      WHERE  f_mmdd(e.event_date) BETWEEN d AND d1
      ORDER  BY f_mmdd(e.event_date), e.event_date;

   ELSE  -- wrap around end of year
      RETURN QUERY
      SELECT *
      FROM   event e
      WHERE  f_mmdd(e.event_date) >= d OR
             f_mmdd(e.event_date) <= d1
      ORDER  BY (f_mmdd(e.event_date) >= d) DESC, f_mmdd(e.event_date), event_date;
      -- chronological across turn of the year
   END IF;
END
$func$;

SELECT * FROM f_anniversary();
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie berechnet man Datumsangaben ohne Berücksichtigung des Jahres in SQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage