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
136 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!

sumber:php.cn
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