Отметка времени в часах для PostgreSQL
Существует ли эквивалент TIMESTAMPDIFF()
для PostgreSQL?
Я знаю, что я могу вычесть две временные метки, чтобы получить postgresql INTERVAL
. Я просто хочу разницу между двумя временными метками в часах, представленных INT.
Я могу сделать это в MySQL следующим образом:
TIMESTAMPDIFF(HOUR, links.created, NOW())
Мне просто нужна разница между двумя метками времени в часах, представленными как целое число.
Решение работает для меня:
SELECT "links_link"."created",
"links_link"."title",
(EXTRACT(EPOCH FROM current_timestamp - "links_link"."created")/3600)::Integer AS "age"
FROM "links_link"
Ответы
Ответ 1
Первые вещи появляются
EXTRACT(EPOCH FROM current_timestamp-somedate)/3600
Не может быть красивым, но разблокировать дорогу. Может быть красивее, если было определено разделение интервала на интервал.
Изменить: если вы хотите, чтобы он был больше нуля, используйте абс или наибольший (..., 0). Какое бы ни было ваше намерение.
Изменить ++: причина, по которой я не использовал age
, состоит в том, что age
с одним аргументом, чтобы процитировать документацию: Вычесть из current_date (в полночь). Это означает, что вы не получите точного "возраста", если не будете работать в полночь. Прямо сейчас это почти 1am здесь:
select age(current_timestamp);
age
------------------
-00:52:40.826309
(1 row)
Ответ 2
Получить поля, где метка времени больше, чем дата в postgresql:
SELECT * from yourtable
WHERE your_timestamp_field > to_date('05 Dec 2000', 'DD Mon YYYY');
Вычесть минуты из timestamp в postgresql:
SELECT * from yourtable
WHERE your_timestamp_field > current_timestamp - interval '5 minutes'
Вычесть часы из метки времени в postgresql:
SELECT * from yourtable
WHERE your_timestamp_field > current_timestamp - interval '5 hours'
Ответ 3
Ответ Майкла Крелина близок не совсем безопасно, так как он может быть неправильным в редких ситуациях. Проблема в том, что интервалы в PostgreSQL не имеют контекста в отношении таких вещей, как переход на летнее время. Интервалы хранят вещи внутри себя как месяцы, дни и секунды. Месяцы не являются проблемой в этом случае, так как вычитание двух временных меток использует только дни и секунды, но "дни" могут быть проблемой.
Если ваше вычитание включает изменения дневного сбережения, конкретный день может считаться 23 или 25 часов соответственно. Интервал учитывает это, что полезно для понимания количества дней, прошедших в символическом смысле, но это дало бы неправильное количество фактических пройденных часов. Эпоха на интервале будет просто умножать все дни на 24 часа.
Например, если полный "короткий" день проходит и дополнительный час следующего дня, интервал будет записываться как один день и один час. Который преобразован в эпоху /3600 составляет 25 часов. Но на самом деле 23 часа + 1 час должны составлять в общей сложности 24 часа.
Таким образом, более безопасный метод:
(EXTRACT(EPOCH FROM current_timestamp) - EXTRACT(EPOCH FROM somedate))/3600
Как упоминал Майкл в своем последующем комментарии, вы также, вероятно, захотите использовать floor() или round(), чтобы получить результат как целочисленное значение.
Ответ 4
Вы можете использовать функции "extract" или "date_part" на интервалах, а также на отметках времени, но я не думаю, что делает то, что вы хотите. Например, он дает 3 для интервала "2 дня, 3 часа". Тем не менее, вы можете преобразовать интервал в несколько секунд, указав "эпоху" в качестве необходимого элемента времени: extract(epoch from '2 days, 3 hours'::interval)
возвращает 183600 (что затем вы делите на 3600, чтобы конвертировать секунды в часы).
Итак, положив все это вместе, вы получите в основном Майкла: extract(epoch from timestamp1 - timestamp2)/3600
. Поскольку вам, похоже, не важно, какая временная метка предшествует этому, вы, вероятно, захотите обернуть это в abs
:
SELECT abs(extract(epoch from timestamp1 - timestamp2)/3600)
Ответ 5
postgresql получить разницу в секундах между отметками времени
SELECT (
(extract (epoch from (
'2012-01-01 18:25:00'::timestamp - '2012-01-01 18:25:02'::timestamp
)
)
)
)::integer
который печатает:
-2
Поскольку метки времени находятся на расстоянии в две секунды. Возьмите число и разделите на 60, чтобы получить минуты, делите на 60 снова, чтобы получить часы.
Ответ 6
Это может показаться сумасшедшим для многих разработчиков, которым нравится использовать функции базы данных,
Но после исчерпывающих проблем мышления, создания и исправления приложений для mysql и postgrsql с помощью php, сравнивающих функции даты, я пришел к выводу (для себя), что самый простой способ, который является самым простым с меньшими головными болями SQL, - это не чтобы воспользоваться любым из них.
Почему? потому что, если вы разрабатываете язык промежуточного программного обеспечения, например PHP, PHP имеет все эти функции, и их проще реализовать в приложении ode при сравнении целых чисел. Пометка времени PostgreSQL НЕ == UNIX TIMESTAMP, а MySQL UNIX TIMESTAMP не является отметкой времени PostgresQL или Oracles. При использовании временных меток базы данных становится сложнее.
поэтому просто используйте целое число, а не метку времени,
как количество секунд с 1 января 1970 года в полночь. и не обращайте внимания на временные метки базы данных.
, и используйте gmdate() и сохраните все как время gmt, чтобы избежать проблем с часовым поясом.
если вам нужно искать, сортировать или сравнивать день с другими данными, а также месяц или год или день недели или что-либо еще в вашем приложении,
и тип данных INTEGER для time_day, time_hour, time_seconds.. или что бы вы ни искали для индексации, чтобы сделать более плавные и более портативные базы данных.
вы можете просто использовать одно поле, в большинстве случаев: INTEGER time_created NOT NULL
(больше полей в строке базы данных является единственным недостатком этого решения, которое я нашел, и это не вызывает столько головных болей, ни чашек кофе:)
Функции даты php выдаются для сравнения дат,
но в mysql или postgresql, сравнивая даты? nah.. использовать целочисленные sql сравнения
Я понимаю, что SEEM легче использовать CURRENT_TIMESTAMP для функции вставки. ХА!
не обманывайте себя.
Вы не можете сделать DELETE FROM SESSION_TABLE WHERE time-initialized < '2 days'
если time-intitialized является меткой времени postgresql.
но вы МОЖЕТЕ сделать:
DELETE FROM SESSION_TABLE WHERE time_initialized < '$yesterday'
Пока вы устанавливаете $вчера в php как целое число секунд с 1970 года, которое было вчера.
Это упрощает ведение записей сеанса, чем сравнение временных меток в операторах выбора postgresql.
SELECT age(), SELECT extract() и asbtime - это головные боли сами по себе. Это только мое мнение.
вы можете делать добавление, подстановку, <, > , все с объектами даты php
_peter_sysko
U4EA Networks, Inc.
Ответ 7
extract(hour from age(now(),links.created))
дает вам округлую цифру разницы в часах.