Вчера адаптировал решение одной задачи под PostgreSQL.
В частности, требовалось вычислить интервал времени в минутах между двумя датами.
В SQL Server это можно сделать, применив встроенную функцию DateDiff:
SELECT datediff (minute, '2011-10-07T23:43:00', '2011-10-08T01:23:00');
В PG я не нашел ничего лучше как представить разность между датами интервалом, извлечь из него число секунд, и, наконец, поделить на 60, чтобы выразить результат в минутах. Итого:
SELECT extract(epoch FROM cast('2011-10-08T01:23:00' AS timestamp) - cast('2011-10-07T23:43:00' AS timestamp))/60;
Слава богу, что округлять ничего не пришлось, т.к. время в базе указывается с точностью до минуты.
Если есть способы проще, прошу поделиться.
Вот задача, о которой шла речь.
Комментарии
А почему функции для работы с датой и временем не смотрели?
http://postgresql.ru.net/manual/functions-datetime.html
По-моему, вместо того, что в скобках можно было бы использовать функцию age, да и extract использовать чтобы извлечь минуты, а не делить то, что в скобках на 60.
А почему функции для работы с датой и временем не смотрели?
Так смотрел же. Просто я искал функцию, соответствующую DateDiff. А когда ее не нашел, то начал делать вручную. Хорошо, итак:
SELECT extract(epoch FROM age('2011-10-08T01:23:00', '2011-10-07T23:43:00'))/60;
> да и extract использовать чтобы извлечь минуты, а не делить то, что в скобках на 60.
Это я не понял. Запрос
SELECT extract(minute FROM interval '1 hour 40 minute');
вернет 40, а не 100. Поясните, пожалуйста, на примере.
> вернет 40, а не 100.
> вернет 40, а не 100. Поясните, пожалуйста, на примере.
Это видимо я не понял по описанию, что оно извлекает только минутную ЧАСТЬ, а не конвертит в минуты.
Так что в этом случае, вы правы.
Т.е., насколько я понял,
Т.е., насколько я понял, проще способа нет.
Спасибо.
Моя задача похожа, только
Моя задача похожа, только дата не задается напрямую в запросе, а хранится в таблице (дни рождения сотрудников). Timestamp с полями не работает. Вы не знаете, как это сделать? Задание такое: найти наибольший интервал межде днями рождениями сотрудников в днях (год не учитывается)