집 >데이터 베이스 >MySQL 튜토리얼 >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 중국어 웹사이트의 기타 관련 기사를 참조하세요!