|
Программирование >> Преобразование значений null
29-JAN-2005 30-JAN-2005 31-JAN-2005 01-DEC-2005 02-DEC-2005 03-DEC-2005 29-DEC-2005 30-DEC-2005 31-DEC-2005 Получив все дни текущего года, подсчитаем, сколько раз в году встречается каждый из дней недели, возвращенных функцией DAYNAME. Окончательный результат приведен ниже: select date format( date add( cast( concat(year(current date),-01-01) as date), interval t500.id-1 day), %W) day, count(*) from t500 where t500.id <= datediff( cast( concat(year(current date)+1,-01-01) as date), cast( concat(year(current date),-01-01) as date)) group by date format( date add( cast( concat(year(current date),-01-01) as date), interval t500.id-1 day), DAY COUNT(*) FRIDAY 52 MONDAY 52 SATURDAY 53 SUNDAY 52 THURSDAY 52 TUESDAY 52 WEDNESDAY 52 01-JAN-2005 02-JAN-2005 03-JAN-2005 29-JAN-2005 30-JAN-2005 31-JAN-2005 01-DEC-2005 02-DEC-2005 Oracle В представленных решениях для формирования строк соответственно количеству дней в году используются или запрос к таблице T500 (сводной таблице), или рекурсивные операторы CONNECT BY и WITH. Вызывая функцию TRUNC, получаем первый день текущего года. При использовании решения CONNECT BY/WITH генерировать порядковые номера, начиная с 1, можно с помощью псевдостолбца LEVEL (уровень). Чтобы создать необходимое для данного решения число строк, фильтруем столбцы ROWNUM или LEVEL по разнице в днях между первым днем текущего года и первым днем следующего года (365 или 366 дней). Следующий шаг - получить все даты года, добавляя значения ROWNUM или LEVEL к первому дню текущего года. Результаты частично представлены ниже: /* Oracle 9i и последующие версии */ with x as ( select level lvl from dual connect by level <= ( add months(trunc(sysdate,y),12)-trunc(sysdate,y) select trunc(sysdate,y)+lvl-1 from x Для решения с использованием сводной таблицы подойдут любая таблица или представление, содержащие, по крайней мере, 366 строк. А поскольку в Oracle есть ROWNUM, нет необходимости в таблице с начинающимися с 1 и последовательно возрастающими значениями. Рассмотрим следующий пример, в котором для получения всех дней текущего года используется сводная таблица T500: /* Oracle 8i и предыдущие версии */ select trunc(sysdate,y)+rownum-1 start date from t500 where rownum <= (add months(trunc(sysdate,y), 12) - trunc(sysdate,y)) START DATE 01-JAN-2005 02-JAN-2005 03-JAN-2005 29-DEC-2005 30-DEC-2005 31-DEC-2005 В любом подходе названия дней недели для каждой даты получаем с помощью функции TO CHAR и затем подсчитываем количество каждого из дней недели в году. Ниже приведены окончательные результаты: /* Oracle 9i и последующие версии */ with x as ( select level lvl from dual connect by level <= ( add months(trunc(sysdate,y),12)-trunc(sysdate,y) select to char(trunc(sysdate,y)+lvl-1,DAY), count(*) from x group by to char(trunc(sysdate,y)+lvl-1,DAY) /* Oracle 8i и предыдущие версии */ select to char(trunc(sysdate,y)+rownum-1,DAY) start date, count(*) from t500 where rownum <= (add months(trunc(sysdate,y),12) - trunc(sysdate,y)) group by to char(trunc(sysdate,y)+rownum-1,DAY) START DATE COUNT(*) FRIDAY 52 MONDAY 52 SATURDAY 53 SUNDAY 52 THURSDAY 52 TUESDAY 52 WEDNESDAY 52 PostgreSQL Первый шаг - с помощью функции DATE TRUNC выбрать год из текущей даты (показана ниже; запрос обращен к таблице T1, поэтому возвращается всего одна строка): select cast( date trunc(year,current date) as date) as start date from t1 START DATE 01-JAN-2005 03-DEC-2005
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |