[英]How to search a specific date from a given month and year in oracle?
给我的月份是 1 表示一月,一年是 2020。现在我想搜索 2020 年一月之间的日期。 假设那一天是 2020 年 1 月 14 日,所以我正在尝试以下代码
select date
from table X
where date between to_date(1||'/'||month||'/'||year,'dd/mm/yyyy')
and to_date(31||'/'||month||'/'||year,'dd/mm/yyyy')
但这个范围是针对一月份的,如果月份是二月或四月,有 30 天怎么办? 如果这个查询不合适那么如何达到完美的结果呢?
你可以像下面那样做,
要查找给定日期的第一个日期和最后一个日期,
select trunc(date'2020-02-14','MM') first_day,
last_day(date'2020-02-14') last_day
from dual;
编辑:在其他用户的评论之后所以最终的查询就像,
select date
from table X
where date between trunc(date'2020-02-14','MM') and last_day(date'2020-02-14');
注意:如果您将日期与时间一起存储,您可能会喜欢@MT0 提供的答案
您可以通过to_char
转换日期以提取要比较的部分。
select *
from dates
where to_char(the_date, 'mm') = '01'
and to_char(the_date, 'yyyy') = '2020'
它的 SQL-Fiddle在这里
使用TO_DATE( your_year_value || '-' || you_month_value, 'YYYY-MM' )
将年月值转换为日期,然后获取上限,您可以使用ADD_MONTHS
function 找到下个月的开始:
SELECT *
FROM table_name
WHERE date_time >= TO_DATE( 2020 || '-' || 1, 'YYYY-MM' )
AND date_time < ADD_MONTHS( TO_DATE( 2020 || '-' || 1, 'YYYY-MM' ), 1 )
(注意:如果您在日期列上使用TRUNC
或TO_CHAR
,则 Oracle 将不会在该列上使用索引;您需要在您使用的确切表达式上使用单独的基于函数的索引。相反,通过计算年份的范围/month 输入而不是转换日期列然后 Oracle 将使用日期列上的索引。)
(注意 2:您不想在2020-01-01
到2020-01-31
的范围内进行比较,因为这将忽略从2020-01-31T00:00:01
到2020-01-31T23:59:59
。相反,您需要使用从2020-01-01
到但不包括2020-02-01
的范围。)
所以,对于一些测试数据:
CREATE TABLE table_name ( date_time DATE );
INSERT INTO table_name( date_time )
SELECT DATE '2020-01-14' FROM DUAL UNION ALL
SELECT DATE '2020-01-31' + INTERVAL '1' HOUR FROM DUAL UNION ALL
SELECT DATE '2020-02-01' FROM DUAL
这输出:
| 日期_时间 | |:-------------------- | | 2020-01-14T00:00:00 | | 2020-01-31T01:00:00 |
db<> 在这里摆弄
您只想检查月份和年份是否匹配,所以不必担心日期。 您可以检查月份和年份是否匹配,而不是检查一个值是否在 2 个特定日期之间。
SELECT date
FROM table
WHERE TO_CHAR(date,'MM-YYYY') = '01-2020'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.