Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Mengira Tarikh Mengabaikan Tahun dalam SQL?

Bagaimana untuk Mengira Tarikh Mengabaikan Tahun dalam SQL?

DDD
Lepaskan: 2025-01-05 07:48:40
asal
177 orang telah melayarinya

How to Calculate Dates Ignoring the Year in SQL?

Cara melakukan pengiraan tarikh yang mengabaikan tahun menggunakan SQL

Masalah:

Anda mahu memilih tarikh yang mempunyai ulang tahun dalam tempoh 14 hari akan datang, tetapi anda mahu melakukan ini dengan mengecualikan tahun.

Contoh Pertanyaan:

SELECT *
FROM events
WHERE EXTRACT(month FROM "date") = 3
AND EXTRACT(day FROM "date") < EXTRACT(day FROM "date") + 14;
Salin selepas log masuk

Cabaran:

Pertanyaan di atas tidak berfungsi kerana ia berfungsi tidak mengambil kira kesan pembalut bagi bulan.

Penyelesaian:

1. Versi Lanjutan

Penyelesaian ini menggunakan fungsi SQL tersuai dan indeks berbilang lajur untuk prestasi optimum.

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);
Salin selepas log masuk

2. Fungsi Jadual

Penyelesaian ini menggunakan fungsi jadual PostgreSQL untuk mengendalikan pengiraan ulang tahun.

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();
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Mengira Tarikh Mengabaikan Tahun dalam SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan