Диапазон дат в 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')