SQL - как изменить формат current_timestamp, чтобы иметь «мм сс» в виде нулей? - PullRequest
0 голосов
/ 30 октября 2019

Я хочу проверить, не исчезла ли метрика через 4 часа, и вернуть одну запись, если она существует. Я написал запрос, который проверяет, были ли показатели за последние 4 часа. Но мне нужно проверить, есть ли показатель за определенный час, который должен был загрузиться за 4 часа.

-- Returns records that appeared within the last 4 hours

select * from main.basic_metrics
where metric_name = 'common_metric' 
and transaction_time > current_timestamp - interval 4 hours

Проблема в том, что transaction_time имеет следующий формат 2019-10-30T12:00:00.000+0000, где mm ss - это всегда нули. Поэтому, когда я проверяю его как transaction_time = current_timestamp - interval 4 hours, он ничего не возвращает, поскольку current_timestamp содержит mm ss данных.

Как мне отформатировать метку времени в формате, аналогичном transaction_time - 2019-10-30T12:00:00.000+0000?

UPD: была опечатка, упомянутая в комментариях ниже. исправил это

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Попробуйте следующее:

select * from main.basic_metrics
where metric_name = 'common_metric' 
and transaction_time = date_trunc('hour',current_timestamp) - interval 4 hours

Это не обязательно лучший запрос для того, что вы делаете, но он решает вашу проблему. Я предполагаю, что какая-то версия «между» или> и <решит эту проблему, однако, не зная точно, как заполняется «время транзакции», я могу только догадываться. </p>

Хитрость в моем примере заключается в том, чтобы «обрезать» все после «часов» отключения current_timestamp с помощью date_trunc ()

Примечание. Это очень помогает понять, что отметки времени НЕ отформатированы. Метки времени - это одно длинное целочисленное поле, которое форматируется на вашем экране, чтобы вы могли разобраться в этом. Сравнение текста почти всегда является неправильным способом выполнения действий, а функции, учитывающие дату и время, являются предпочтительным методом для любого сравнения.

0 голосов
/ 30 октября 2019

Это должно быть очень просто: приведите строку к timestamp with time zone:

WHERE CAST(transaction_time AS timestamp with time zone)
      > current_timestamp - INTERVAL '4 hours'
...