通过仅传递 sql 中的部分日期来过滤时间戳中的数据

Filter data from timestamp by passing only part of date in sql

我想编写查询来过滤来自 table 的数据集,方法是仅将日期的一部分作为年份和月份或季度范围和年份传递 (部分日期)的传递值 -> 2021-4 或 Q1-2021 但在 table 中,日期存储为 01-APR-21 1222.36643100 PM ASIA/COLOMBO

我可以知道如何过滤数据吗? 我从这样过滤数据,但这不是我想要的。 -> Select * 来自 A where CAST(A.startDate as DATE) like '%-APR-21'

也许 EXTRACT 方法会有用。

例如你的情况:

Select * from A 
where EXTRACT(MONTH FROM A.startDate) = 4
AND EXTRACT(YEAR FROM A.startDate) = 2021

用法

SELECT EXTRACT(<PART> FROM A.startDate);

选项 1:使用日期范围

SELECT *
FROM   A
WHERE  DATE '2021-04-01' <= start_date
AND    start_date < DATE '2021-07-01'

SELECT *
FROM   A
WHERE  TIMESTAMP '2021-04-01 00:00:00 ASIA/COLOMBO' <= start_date
AND    start_date < TIMESTAMP '2021-07-01 00:00:00 ASIA/COLOMBO'

选项 2:截断到季度开始

SELECT *
FROM   A
WHERE  DATE '2021-04-01' = TRUNC(start_date, 'Q')

选项 3:使用 EXTRACT

SELECT *
FROM   A
WHERE  EXTRACT(YEAR FROM start_date) = 2021
AND    EXTRACT(MONTH FROM start_date) IN (4, 5, 6)

注意:虽然它们都可以工作,但只有选项 1 会在 start_date 列上使用索引。第二个选项需要 TRUNC(start_date, 'Q') 上的 function-based 索引,第三个选项需要 EXTRACT(YEAR FROM start_date)EXTRACT(MONTH FROM start_date) 上的两个 function-based 索引(或单个复合索引两者).