Giả sử ngày của bạn luôn có thành phần thời gian vào lúc nửa đêm thì:
SELECT *
FROM your_table
WHERE your_date_column IN (
TRUNC( SYSDATE ),
TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY,
ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -12 ),
ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -24 ),
ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -36 ),
ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -48 )
);
(Bạn cần thêm 1 ngày trước khi cắt bớt để phù hợp với trường hợp hôm nay là ngày 31 tháng 12)
Giải pháp đơn giản là sử dụng TRUNC
vào ngày.
SELECT *
FROM your_table
WHERE TRUNC( your_date_column ) IN (
TRUNC( SYSDATE ),
TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY,
ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -12 ),
ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -24 ),
ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -36 ),
ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -48 )
);
Nhưng sau đó bạn không thể sử dụng chỉ mục trên cột và sẽ cần chỉ mục dựa trên hàm trên TRUNC( your_date_column )
để có thể sử dụng một chỉ mục.
Giải pháp phức tạp hơn, có thể sử dụng các chỉ mục, là:
SELECT *
FROM your_table
WHERE ( your_date_column >= TRUNC( sysdate )
AND your_date_column < TRUNC( sysdate ) + INTERVAL '1' DAY
)
OR ( your_date_column >= TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY
AND your_date_column < TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' )
)
OR ( your_date_column >= ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -12 )
AND your_date_column < ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ), -12 )
)
OR ( your_date_column >= ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -12 )
AND your_date_column < ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ), -24 )
)
OR ( your_date_column >= ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -12 )
AND your_date_column < ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ), -36 )
)
OR ( your_date_column >= ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -12 )
AND your_date_column < ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ), -48 )
);