如何在Oracle查询中的两个给定日期之间选择日期?

时间:2011-02-18 12:15:19

标签: oracle

如何在Oracle查询中的两个给定日期之间选择日期?

9 个答案:

答案 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;) ;