>데이터 베이스 >MySQL 튜토리얼 >SQL에서 연도를 무시하고 날짜를 계산하는 방법은 무엇입니까?

SQL에서 연도를 무시하고 날짜를 계산하는 방법은 무엇입니까?

DDD
DDD원래의
2025-01-05 07:48:40141검색

How to Calculate Dates Ignoring the Year in SQL?

SQL을 사용하여 연도를 무시하는 날짜 계산을 수행하는 방법

문제:

다음이 있는 날짜를 선택하려고 합니다. 다음 14일 이내에 기념일이 있지만 year.

예제 쿼리:

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

챌린지:

위 쿼리는 작동하지 않습니다. 랩어라운드 효과를 고려하지 않음 개월.

해결책:

1. 고급 버전

이 솔루션은 최적의 성능을 위해 사용자 지정 SQL 함수와 다중 열 인덱스를 사용합니다.

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);

2. 테이블 함수

이 솔루션은 PostgreSQL 테이블 함수를 사용하여 기념일 계산을 처리합니다.

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();

위 내용은 SQL에서 연도를 무시하고 날짜를 계산하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.