Диапазон дат в PL / SQL (Oracle)

если у меня есть таблица с столбцом даты под названием myDate со значениями типа 2009-08-25 09:00:09.0.

Я хочу, чтобы выбрать все строки 25 августа С 12:00:01 АМ до 11: 59: 59 PM и 26 августа. Достаточно ли просто использовать условие:

where myDate between Date '2009-08-25' and Date '2009-08-26'

и я хочу выбрать все строки перед 25 августа, не включая 25 августа. Могу ли я сделать:

where myDate < Date '2009-08-25'

4 ответов


если вы хотите данные за полный день 25 и исключая все 26, вам нужно удалить первую секунду из 26:

where myDate >= Date '2009-08-25' and myDate < Date '2009-08-26'

или

where myDate between Date '2009-08-25' and Date '2009-08-26' - interval '1' second

обновление -- немного точности: в Oracle DATE тип данных используется как для типа дата С или без времени. Если вы имеете дело с датами без времени, он обычно хранится с 00:00 отрезком времени, что означает полночь. Из-за этого первый между (my_date between '2009-08-25' and '2009-08-26') могут выбрать два полных дни.

удалив первую секунду из 26, вы гарантируете, что вы не будете случайно выбирать строки из 26.


чтобы получить все между 25 августа, в 12: 00: 01 AM до 11:59: 59 PM, включительно, попробуйте следующее:

  Where myDate Between to_Date('yyyymmddhh24miss', '20090825000001') 
                  And  to_Date('yyyymmddhh24miss', '20090825235959') 

(почему вы исключаете полночь 25-го ?? Эта первая секунда (00: 00: 00) также является частью 25-го... )

чтобы получить все до 25 августа, попробуйте следующее:

Where myDate < to_Date('yyyymmdd', '20090825')

этот trunc год, но вы получите мою суть:

SELECT (select trunc(sysdate - (SELECT TRUNC(SYSDATE) -
                                       add_months(trunc(sysdate, 'YEAR'), -24)
                                  FROM DUAL))from DUAL)+ (ROWNUM - 1) effective_date
                                  FROM DUAL
                                  CONNECT BY LEVEL <= (SELECT TRUNC(SYSDATE) - add_months(trunc(sysdate, 'YEAR'), -24)
                                  FROM DUAL);

SELECT   *
FROM   TABLE
 WHERE   myDate BETWEEN myDate  ('08/25/2009', 'MM/DD/YYYY')
                         AND  myDate  ('08/26/2009', 'MM/DD/YYYY')