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

Функция 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.

Bookmark and Share
Страницы: 1 2
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INFORMATION_SCHEMA INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker Больше тэгов
Учебник обновлялся
несколько дней назад
продать alipay
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100