#sql #datetime #timestamp
Вопрос:
Я смог преобразовать поле МЕТКИ ВРЕМЕНИ, которое находится в формате UTC, в CST, используя:
SELECT
TIMESTAMP(started_at) AS UTC,
TIMESTAMP_SUB(TIMESTAMP (started_at), INTERVAL 5 HOUR) AS CST
Это возвращает:
ряд | UTC | CST |
---|---|---|
1 | 2020-05-17 13:07:22 UTC | 2020-05-17 08:07:22 UTC |
Вторая МЕТКА времени отображает правильную дату и время, но UTC все еще отображается. Каков самый простой способ заменить » UTC » на » CST «или, в качестве альтернативы, вообще удалить «UTC», поскольку мне не нужно обозначение в самом поле?
Ответ №1:
Вы можете использовать встроенную функцию простой замены sql
select replace(TIMESTAMP_SUB(TIMESTAMP (started_at), INTERVAL 5 HOUR), 'UTC','') AS CST
Вышеизложенное выполняет поиск результата вашего выражения (указанного в вашем вопросе) 'UTC'
и заменяет его ничем ''
. Вы также можете заменить его, 'CST'
как вы отметили.
Обязательное предупреждение: Я полагаю, что ваш запрос будет правильным только в течение полугода, пока соблюдается летнее время? Возможно, вы захотите изучить sys.time_zone_info
и его ссылку на MSDN.
Комментарии:
1. Спасибо вам за помощь. Я понимаю, что это будет работать только в то время, когда в США действует стандартное время, но тематическое исследование проекта capstone, над которым я работаю, действительно больше сосредоточено на продолжительности аренды велосипедов и с кивком в сторону отслеживания аренды по дням недели. Однако я обязательно отмечу, что преобразование в DST не было выполнено, и буду иметь это в виду для следующего «реального» анализа.:)
2. Теперь я получаю эту ошибку при вставке кода: Нет совпадающей подписи для замены функции для типов аргументов: МЕТКА ВРЕМЕНИ, СТРОКА, СТРОКА. Поддерживаемые подписи: ЗАМЕНИТЬ(СТРОКА, СТРОКА, СТРОКА); ЗАМЕНИТЬ(БАЙТЫ, БАЙТЫ, БАЙТЫ) в [2:5]. Что я упускаю?
Ответ №2:
Мой совет-преобразовать метку времени в datetime
локальное значение:
select datetime(started_at, 'America/Chicago') as started_at_cst
Обратите внимание, что часовой пояс не сохраняется в значении данных. Вместо этого это кодирует значение в строке.
Если вы хотите включить значение часового пояса, я обнаружил, что лучший подход-использовать строку (аргххх!). Следующие конструкции представляют собой строку:
format_timestamp('%F %X%z', started_at, 'America/Chicago') as started_at_str
который может быть легко преобразован в метку времени для вычисления даты/времени:
timestamp(started_at_str)
Комментарии:
1. ОК. Для этого не нужно указывать значение часового пояса. Я просто хочу иметь возможность рассчитать правильный день недели в правильном часовом поясе и не отвлекаться, показывая неправильную метку часового пояса, даже если МЕТКА ВРЕМЕНИ была обновлена. Ценю ваш ответ.
2. @KevinKish . . . Для s нет «неправильного» часового
TIMETSTAMP
пояса. Они всегда представлены в UTC. Если вы сохраните значение в виде строк, то сможете обойти эту проблему.3. Ааа. Так что, вероятно, это объясняет, почему я не смог найти решение там, где искал его … пытаясь преобразовать саму МЕТКУ ВРЕМЕНИ. Действительно приятно знать это сейчас. Надо пойти положить немного льда на голову, где я стучал им по столу 😉
4. @KevinKish . . . Я описал решение, которое я придумал.