Программирование >>  Преобразование значений null 

1 ... 78 79 80 [ 81 ] 82 83 84 ... 219


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



1 ... 78 79 80 [ 81 ] 82 83 84 ... 219

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика