Подтвердить что ты не робот

Отметка времени в часах для 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"
4b9b3361

Ответ 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)) дает вам округлую цифру разницы в часах.