如何在Oracle查询中的两个给定日期之间选择日期?
答案 0 :(得分:8)
SELECT TO_DATE('12/01/2003', 'MM/DD/YYYY') - 1 + rownum AS d
FROM all_objects
WHERE TO_DATE('12/01/2003', 'MM/DD/YYYY') - 1 + rownum <= TO_DATE('12/05/2003', 'MM/DD/YYYY')
这
http://forums.devshed.com/oracle-development-96/select-all-dates-between-two-dates-92997.html
答案 1 :(得分:8)
SELECT * FROM your_table WHERE your_date_field BETWEEN DATE '2010-01-01' AND DATE '2011-01-01';
答案 2 :(得分:4)
你可以用一种棘手的方式使用LEVEL伪列来生成一个系列,例如,从今天到现在的20天之间获取天数列表我可以:
select trunc(sysdate+lvl) from
(select level lvl from dual connect by level < ((sysdate+20)-sysdate - 1) )
order by 1
通常情况下,您可以看到这适用于任何两个给定日期。
select trunc(early_date+lvl) from
(select level lvl from dual connect by level < (later_Date-early_date-1) )
order by 1
如果你想包括两个结束日期,你可以调整这些条款。
答案 3 :(得分:1)
使用“之间”。一般来说:
select * from someTable where dateCol between date1 and date2;
请注意,dateCol定义为日期,date1和date2也是日期值。如果这些不是日期,那么您将使用to_date函数将它们转换为日期。
答案 4 :(得分:1)
您还可以使用以下内容获取日期范围之间的日历日期列表(类似于 Michael Broughton 的解决方案)
select (trunc(sysdate) - (trunc(sysdate) - (to_date('start_date')))) -1 + level from dual
connect by level <=
((select (trunc(sysdate) - (trunc(sysdate) - (to_date('end_date'))))-
(trunc(sysdate) - (trunc(sysdate) - (to_date('start_date'))))from dual)+1);
答案 5 :(得分:0)
这也是PL SQL official文档中提到的最佳方法。
我们必须使用PL SQL内置函数 TO_DATE(日期,日期格式)来获得解决方案。
SELECT * FROM order_details
WHERE order_date
BETWEEN
TO_DATE ('2014/02/01', 'yyyy/mm/dd')
AND
TO_DATE ('2014/02/28', 'yyyy/mm/dd');
使用比较运算符
与以下语句等效SELECT * FROM order_details
WHERE order_date >= TO_DATE('2014/02/01', 'yyyy/mm/dd')
AND order_date <= TO_DATE('2014/02/28','yyyy/mm/dd');
答案 6 :(得分:0)
我经常为我工作的调度应用程序执行此操作,因此我创建了一个流水线表函数。有时我需要几天、几小时或 15 分钟的时间间隔。这不完全是我的功能,因为我的代码在一个包中。例如,在这里,我在 2020 年 1 月 1 日和 2020 年 1 月 10 日之间得到了几天:
SELECT
days.date_time
FROM
table(between_times(TO_DATE('2020-01-01'),TO_DATE('2020-01-10'),(60*24), 'Y')) days
流水线函数:
function between_times(i_start_time TIMESTAMP, i_end_time TIMESTAMP, i_interval_in_minutes NUMBER, include_end_time VARCHAR2 := 'N')
RETURN DateTableType PIPELINED
AS
time_counter TIMESTAMP := i_start_time;
BEGIN
IF i_start_time IS NULL OR i_end_time IS NULL or i_start_time > i_end_time OR i_interval_in_minutes IS NULL OR
i_interval_in_minutes <= 0 THEN
RETURN;
END IF;
LOOP
-- by default does not include end time
if (include_end_time = 'Y') THEN
exit when time_counter > i_end_time;
ELSE
exit when time_counter >= i_end_time;
END IF;
pipe row(DateType( time_counter ));
time_counter := time_counter + i_interval_in_minutes/(60*24);
END LOOP;
EXCEPTION WHEN NO_DATA_NEEDED THEN NULL;
END;
答案 7 :(得分:-1)
select * from yourtable where somedate between sysdate and sysdate - 42
答案 8 :(得分:-1)
将all_days作为(选择截断(to_date(&#39; 12-03-2017&#39;,&#39; dd-mm-yyyy&#39;)+ levl)-1作为all_dates来自 (按级别选择双级连接级别&lt;(sysdate-to_date(&#39; 12-03-2017&#39;,&#39; DD-MM-YYYY&#39;)+ 1)) 订购1) 从all_days中选择count(*)为no_of_days,其中ltrim(rtrim(to_char(all_dates,&#39; DAY&#39;)))不在(&#39; SATURDAY&#39;,&#39; SUNDAY&#39;) ;