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

1 ... 76 77 78 [ 79 ] 80 81 82 ... 219


with x

(start date,end date)

as (

select

start date,

start date + 1 year end date

from

select

(current date -

dayofyear(current date) day)

+1 day as start date

from

) tmp

union

select

start date + 1 day, end date

from

where

start date + 1 day < end date

select

dayname(start date),count(*)

from

group

by dayname(start date)

Умножаем количество дней между значениями WARD HD и ALLEN HD на 24 (число часов в дне), 1440 (число минут в дне) и 86400 (число секунд в дне).

Как подсчитать, сколько раз в году повторяется каждый день недели

Задача

Требуется подсчитать, сколько раз в году повторяется каждый день недели.

Решение

Чтобы найти, сколько раз повторяется каждый день недели за год, необходимо:

1. Сгенерировать все возможные даты года.

2. Отформатировать даты таким образом, чтобы в них был указан соответствующий день недели.

3. Подсчитать, сколько раз за год встречается название каждого дня недели.

Используйте рекурсивный WITH, чтобы не делать выборку, состоящую, по меньшей мере, из 366 строк. Чтобы получить название дня недели для каждой даты, используйте функцию DAYNAME и затем подсчитайте количество дней с каждым именем:



MySQL

Сначала сделайте запрос к таблице T500, чтобы получить достаточно строк для выбора всех дней года. Чтобы получить название дня недели для каждой даты, используйте функцию DATE FORMAT и затем подсчитайте количество дней с каждым именем:

1 select date format(

2 date add(

3 cast(

4 concat(year(current date),-01-01)

5 as date),

6 interval t500.id-1 day),

7 %W) day,

8 count(*)

9 from t500

10 where t500.id <= datediff(

11 cast(

12 concat(year(current date)+1,-01-01)

13 as date),

14 cast(

15 concat(year(current date),-01-01)

16 as date))

17 group by date format(

18 date add(

19 cast(

20 concat(year(current date),-01-01)

21 as date),

22 interval t500.id-1 day),

23 %W)

Oracle

При работе с Oracle 9i Database или более поздними версиями для получения всех дней года можно использовать рекурсивный оператор CONNECT BY. В Oracle 8i Database и более ранних версиях выполняется запрос к таблице T500, чтобы сгенерировать достаточно строк для возвращения всех дней года. В любом случае название дня недели получаем с помощью функции TO CHAR и затем подсчитываем количество дней с каждым именем.

Сначала решение с CONNECT BY:

1 with x as (

2 select level lvl

3 from dual

4 connect by level <= (

5 add months(trunc(sysdate,y),12)-trunc(sysdate,y)

8 select to char(trunc(sysdate,y)+lvl-1,DAY), count(*)

9 from x

10 group by to char(trunc(sysdate,y)+lvl-1,DAY)



Для SQL Server 2000 и более ранних версий. - Примеч. науч. ред.

и следующее решение для более старых версий Oracle:

1 select to char(trunc(sysdate,y)+rownum-1,DAY),

2 count(*)

3 from t500

4 where rownum <= (add months(trunc(sysdate,y),12)

5 - trunc(sysdate,y))

6 group by to char(trunc(sysdate,y)+rownum-1,DAY)

PostgreSQL

Посредством встроенной функции GENERATE SERIES сформируйте количество строк, соответствующее количеству дней в году. Затем с помощью функции TO CHAR получите название дня недели для каждой даты. Наконец, подсчитайте количество дней с каждым именем. Например:

1 select to char(

2 cast(

3 date trunc(year,current date)

4 as date) + gs.id-1,DAY),

5 count(*)

6 from generate series(1,366) gs(id)

7 where gs.id <= (cast

8 ( date trunc(year,current date) +

9 interval 12 month as date) -

10 cast(date trunc(year,current date)

11 as date))

12 group by to char(

13 cast(

14 date trunc(year,current date)

15 as date) + gs.id-1,DAY)

SQL Server

Используйте рекурсивный WITH, чтобы не делать выборку, состоящую, по меньшей мере, из 366 строк. Для версий SQL Server1, не поддерживающих оператор WITH, используйте альтернативное решение Oracle как руководство по применению сводной таблицы. Чтобы получить название дня недели для каждой даты, используйте функцию DAYNAME и затем подсчитайте количество дней с каждым именем. Например:

1 with x (start date,end date)

2 as (

3 select start date,

4 dateadd(year,1,start date) end date

5 from (

6 select cast(

7 cast(year(getdate()) as varchar) + -01-01

8 as datetime) start date



1 ... 76 77 78 [ 79 ] 80 81 82 ... 219

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