2013-05-03 5 views
2

Есть ли «простой» способ рассчитать подсчет определенного дня между двумя датами (например, я хотел бы узнать количество вторников с 1 января 2000 года по сегодняшний день)? Более того, тот же вопрос применяется более широко в разных единицах (например, сколько 2pms между двумя датами, сколько Februaries, сколько 21 августа и т. Д.) ... Лучшее, что я придумал (в течение нескольких дней между датами) это:Число отдельных дней между двумя датами

with calendar as (
    select  to_char(:start + level - 1, 'DAY') dayOfWeek 
    from  dual 
    connect by level <= ceil(:end - :start) 
) 
select dayOfWeek, count(dayOfWeek) 
from  calendar 
group by dayOfWeek; 

Я бы создать представление этого - жесткое кодирование даты начала и окончания - чтобы сделать его удобным (МОГ) для использования; либо это, либо написать функцию для выполнения грязной работы. Это не было бы трудно, но мне интересно, если есть уже функция Oracle, которая может сделать это, составляя такие вещи, как високосных дней, и т.д.


EDITThis появился в соответствующих ссылок при Я разместил это. Это более или менее ответит на вопрос в течение нескольких дней, и я знаю, что есть функция months_between, которую я мог бы использовать в течение определенных месяцев. Любые другие связанные функции, о которых я должен знать?

+1

См http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions002.htm#i88891 для списка функций даты Oracle. –

+1

Создайте себе [Таблица календаря] (http://www.perpendulum.com/2012/06/calendar-table-script-for-oracle/), и все ваши проблемы с датой исчезнут. – GarethD

ответ

1

Замените даты начала и окончания ваших дат. Этот запрос известково число ТИ с января 1-2013 до сегодняшнего дня, что 18:

SELECT count(*) number_of_tue 
    FROM 
(
SELECT TRUNC(TO_DATE(Sysdate), 'YEAR') + LEVEL-1 start_dt 
     , To_Char(TRUNC(TO_DATE(Sysdate), 'YEAR') + LEVEL - 1, 'DY') wk_day 
     , To_Char(TRUNC(TO_DATE(Sysdate), 'YEAR') + LEVEL - 1, 'D') wk_day# 
     , trunc(Sysdate) end_dt 
    FROM DUAL 
CONNECT BY LEVEL <= trunc(Sysdate) - trunc(Sysdate, 'YEAR') -- replace with your start/end dates 
) 
WHERE wk_day# = 3 -- OR wk_day = 'TUE' -- 
/
+0

Спасибо, но как это отличается от моего запроса? Вы просто используете подзапрос, а не CTE. – Xophmeister

+0

Нет разницы между ними. что вы вызываете CTE или мой запрос. Я не проверял ваш запрос перед публикацией моего. Мой запрос имеет больше дат для проверки и просмотра фактических дат, а также дня недели и т. Д. Выберите любой, чтобы создать представление. Это не может быть проще, чем это. – Art

Смежные вопросы