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

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

Задача. Посчитать число минут в интервале между двумя датами – '2011-10-07 23:43:00' и '2011-10-08 01:23:00'


SQL Server

Встроенная функция DATEDIFF решает проблему:

Консоль
Выполнить
  1. SELECT DATEDIFF (minute, '2011-10-07T23:43:00', '2011-10-08T01:23:00');

Результат – 100 минут.

Примечание:

В запросе используется стандартное представление даты (ISO) в виде текстовой строки 'yyyy-mm-ddThh:mm:ss', которое не зависит ни от локальных настроек сервера, ни и от самого сервера.


MySQL

Функция DATEDIFF есть и в MySQL, однако она имеет совсем другой смысл. DATEDIFF вычисляет число дней между двумя датами, являющихся аргументами этой функции. При этом если дата представлена в формате дата-время, используется только составляющая даты. Поэтому все три нижепредставленных запроса дадут один и тот же результат   -1. Положительный результат будет получен, если первый аргумент больше второго.

  1. SELECT DATEDIFF('2011-10-07T23:43:00', '2011-10-08T01:23:00');
  2. SELECT DATEDIFF('2011-10-07', '2011-10-08');
  3. SELECT DATEDIFF('2011-10-07T23:43:00', '2011-10-08');

Один день мы получим даже в случае, если интервал между датами составляет все одну секунду:

  1. SELECT DATEDIFF('2011-10-07T23:59:59', '2011-10-08T00:00:00');

Решение же нашей задачи можно получить при помощи другой встроенной функции – TIMESTAMPDIFF, которая аналогичная функции DATEDIFF в SQL Server:

  1. SELECT TIMESTAMPDIFF(minute, '2011-10-07T23:43:00', '2011-10-08T01:23:00');

PostgreSQL

В PostgreSQL нет функции, подобной DATEDIFF (SQL Server) или TIMESTAMPDIFF (MySQL). Поэтому для решения задачи можно применить следующую последовательность действий:

  1. представить разность между двумя датами интервалом;
  2. посчитать число секунд в интервале;
  3. поделить полученное на шаге 2 значение на 60, чтобы выразить результат в минутах.

Для получения интервала можно взять разность двух значений темпорального типа, При этом требуется явное преобразование типа:

  1. SELECT timestamp '2011-10-08T01:23:00' - timestamp '2011-10-07T23:43:00';
или в стандартном исполнении

  1. SELECT CAST('2011-10-08T01:23:00' AS timestamp) - CAST('2011-10-07T23:43:00' AS timestamp);

Результат - "01:40:00", который есть не что иное, как один час и сорок минут.

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

  1. SELECT AGE ('2011-10-08T01:23:00', '2011-10-07T23:43:00');

Для получения числа секунд в интервале воспользуемся функцией

  1. EXTRACT(EPOCH FROM < interval >)

Значение интервала представим последним способом как наиболее коротким. Для получения окончательного решения задачи поделим полученный результат на 60:

  1. SELECT EXTRACT(EPOCH FROM AGE('2011-10-08T01:23:00', '2011-10-07T23:43:00'))/60;

В данном случае мы имеем результат, выраженный целым числом, поскольку оба значения времени в задаче не содержали секунд. В противном случае, будет получено десятичное число, например: 99.75:

  1. SELECT EXTRACT(EPOCH FROM AGE ('2011-10-08T01:23:00', '2011-10-07T23:43:15'))/60;

Страницы: 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