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

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

6 голосов
/ 26 августа 2009

Если у меня есть таблица со столбцом «Дата» с именем myDate, со значениями вроде 2009-08-25 09:00:09.0.

Я хочу выбрать все строки для 25 августа , от 12: 00: 01 AM до 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 ]

12 голосов
/ 26 августа 2009

Если вам нужны данные за полный 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.

2 голосов
/ 26 августа 2009

Чтобы получить все с 25 августа, с 12:00:01 до 23:59:59 включительно, попробуйте это:

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

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

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

Where myDate < to_Date('yyyymmdd', '20090825')
0 голосов
/ 10 мая 2018

Это год, но вы понимаете, суть:

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);
0 голосов
/ 26 августа 2009
SELECT   *
FROM   TABLE
 WHERE   myDate BETWEEN myDate  ('08/25/2009', 'MM/DD/YYYY')
                         AND  myDate  ('08/26/2009', 'MM/DD/YYYY')  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...