loading..
Русский    English
18:18
листать

Функция DATEPART стр. 2

MySQL

В MySQL для извлечения каждой составляющей даты имеется соответствующая функция. Так, например, можно получить минуты времени отправления рейсов, которые вылетают в 1-ом часу дня (база данных "Аэропорт"):

Решение 1

  1. SELECT time_out, MINUTE(time_out) 
  2. FROM trip
  3. WHERE HOUR(time_out) = 12;
time_out    min
1900-01-01 12:35:00   35
1900-01-01 12:00:00   0

Компоненту времени можно также получить при помощи функции EXTRACT. С помощи этой функции решение задачи можно записать в виде:

Решение 2

  1. SELECT time_out, EXTRACT(MINUTE FROM time_out) AS MIN
  2. FROM trip
  3. WHERE EXTRACT(HOUR FROM time_out) = 12;

Дополнительно с помощью функции EXTRACT можно получить составные компоненты даты/времени, например, год и месяц. Решим такую задачу.

Посчитать количество окрасок по месяцам с учетом года (база данных "Окраска").


Решение 3

  1. SELECT YEAR(b_datetime) AS y, MONTH(b_datetime) AS m,
  2. EXTRACT(YEAR_MONTH FROM b_datetime) AS ym, COUNT(*) AS qty
  3. FROM utb
  4. GROUP BY EXTRACT(YEAR_MONTH FROM b_datetime);

m   ym     qty
2000 1 200001 1
2001 1 200101 1
2002 1 200201 1
2002 6 200206 1
2003 1 200301 69
2003 2 200302 7
2003 3 200303 2
2003 4 200304 2
2003 5 200305 2
2003 6 200306 2

Полный список допустимых компонент можно найти, например, здесь.

Примечание:

Здесь уместно будет отметить довольно вольную трактовку группировки в MySQL, при которой в списке столбцов предложения SELECT могут присутствовать столбцы с детализированными данными, отсутствующими в предложении GROUP BY. Очевидно, что агрегаты здесь подразумеваются, т.к., в противном случае, отсутствует однозначная интерпретация операции. Предполагаю, что здесь неявно используются функция MIN или MAX, но я даже не буду это специально выяснять, т.к. предпочитаю в подобных случаях следовать стандарту.

PostgreSQL

Функций типа Year, Month и т.д. в PostgreSQL, насколько мне известно, нет. Однако есть функция EXTRACT, и второе решение первой задачи, которое мы написали для MySQL, будет работать и под этой СУБД:

  1. SELECT time_out, EXTRACT(MINUTE FROM time_out) AS MIN
  2. FROM trip
  3. WHERE EXTRACT(HOUR FROM time_out) = 12;

Имеется также функция, аналогичная DATEPART в MSSQL. Различия в синтаксисе, надеюсь, станут очевидны из примера решения той же задачи с использованием этой функции:

  1. SELECT time_out, DATE_PART('MINUTE', time_out) AS MIN
  2. FROM trip
  3. WHERE DATE_PART('HOUR', time_out) = 12;

Перейдем к решению второй задачи. Составные компоненты не поддерживаются в функции EXTRACT для PostgreSQL. Поэтому можно использовать "классическую" групировку по двум компонентам - году и месяцу:

Решение 4

  1. SELECT EXTRACT(YEAR FROM b_datetime) AS y,
  2. EXTRACT(MONTH FROM b_datetime) AS m, COUNT(*) AS qty
  3. FROM utb
  4. GROUP BY EXTRACT(YEAR FROM b_datetime), EXTRACT(MONTH FROM b_datetime);

Тем не менее, мы можем реализовать идею составной компоненты при помощи функции форматирования даты TO_CHAR:

  1. SELECT TO_CHAR(b_datetime, 'YYYYMM') AS ym, COUNT(*) AS qty
  2. FROM utb
  3. GROUP BY TO_CHAR(b_datetime, 'YYYYMM');

Результат будет аналогичен результату решения 3 за отсутствием первых двух столбцов, которые, разумеется, можно добавить в вывод, включив их одновременно в предложение GROUP BY, как это сделано в решении 4.

Страницы: 1 2
Тэги:
ALL AVG battles CASE CAST CHAR CHARINDEX classes COALESCE Convert COUNT CTE DATEDIFF DATEPART DATETIME DELETE DISTINCT EXCEPT EXISTS EXTRACT FROM FULL JOIN GROUP BY Guadalcanal HAVING IN INNER JOIN insert INTERSECT ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX MIN MySQL NOT IN NULL ORDER BY Outcome outcomes OVER PARTITION BY pc PIVOT PostgreSQL printer product Больше тэгов
Учебник обновлялся
несколько дней назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100