Как преобразовать метку времени UNIX (bigint) в DateTime в SQL Server?
sql
sql-server
datetime
unix-timestamp
Салман
источник
источник
Это сработало для меня:
В случае, если кто-то задается вопросом, почему 1970-01-01, это называется временем эпохи .
Ниже приводится цитата из Википедии:
источник
Если кто-то получает ошибку ниже:
из-за того, что временная метка unix находится в bigint (вместо int), вы можете использовать это:
Замените жестко запрограммированную метку времени для вашего фактического столбца на временную метку unix
Источник: MSSQL bigint Unix Timestamp to Datetime с миллисекундами
источник
Как это
добавить дату и время Unix (эпоха) к базовой дате в секундах
сейчас это будет (2010-05-25 07: 56: 23.000)
Если вы хотите пойти в обратном направлении, взгляните на этот http://wiki.lessthandot.com/index.php/Epoch_Date
источник
Это сделает это:
Вместо! Точности! используйте: ss, ms или mcs в зависимости от точности метки времени. Bigint способен сохранять точность до микросекунд.
источник
Проверьте это:
Sql-сервер:
Сервер MySql:
http://www.w3resource.com/mysql/date-and-time-functions/mysql-from_unixtime-function.php
источник
Добавление n секунд
1970-01-01
даст вам дату в формате UTC, потому что n , временная метка Unix, - это количество секунд, прошедших с 00:00:00 по всемирному координированному времени (UTC), четверг, 1 января 1970 года .В SQL Server 2016 вы можете преобразовать один часовой пояс в другой, используя
AT TIME ZONE
. Вам просто нужно знать название часового пояса в стандартном формате Windows:Или просто:
Ноты:
DATETIMEOFFSET
кDATETIME
.источник
Если время указано в миллисекундах и нужно их сохранить:
источник
Это основано на работе, проделанной Дэниелом Литтлом для этого вопроса, но с учетом перехода на летнее время (работает для дат 01-01 1902 и более поздних из-за ограничения int в функции dateadd):
Сначала нам нужно создать таблицу, в которой будут храниться диапазоны дат для перехода на летнее время (источник: История времени в США ):
Теперь мы создаем функцию для каждого американского часового пояса. Предполагается, что время unix указано в миллисекундах. Если это в секундах, удалите / 1000 из кода:
Тихий океан
Восточная
Центральная
Гора
Гавайи
Аризона
Аляска
источник
источник
Мне тоже пришлось столкнуться с этой проблемой. К сожалению, ни один из ответов (здесь и на десятках других страниц) меня не удовлетворил, поскольку я до сих пор не могу достичь дат после 2038 года из-за каких-то 32-битных целочисленных приведений.
Решение, которое в конечном итоге сработало для меня, заключалось в использовании
float
переменных, чтобы я мог иметь как минимум максимальную дату2262-04-11T23:47:16.854775849
. Тем не менее, это не распространяется на всюdatetime
область, но этого достаточно для моих нужд и может помочь другим столкнуться с той же проблемой.Следует учесть следующие моменты:
@ticksofday
и первую строку алгоритма.1900-01-01
- это дата происхожденияdatetime2
, как и эпоха1970-01-01
для временных меток unix.float
s помог мне решить проблему 2038 года и целочисленные переполнения и тому подобное, но имейте в виду, что числа с плавающей запятой не очень производительны и могут замедлить обработку большого количества временных меток. Кроме того, числа с плавающей запятой могут привести к потере точности из-за ошибок округления, как вы можете видеть в сравнении результатов примера для максимальной даты выше (здесь ошибка составляет около 1,4425 мс).datetime
. К сожалению, не существует явного преобразования числовых значений вdatetime2
разрешенное, но разрешено явное преобразование числовых значений в , аdatetime
это, в свою очередь, неявно преобразуется вdatetime2
. На данный момент это может быть правильным, но может измениться в будущих версиях SQL Server: либо будетdateadd_big()
функция, либоdatetime2
будет разрешено явное приведение к, либо явное приведение кdatetime
будет запрещено, так что это может либо сломаться, либо может произойти когда-нибудь будет проще.источник
Вот самый простой способ для GMT:
источник
Лучше? Эта функция преобразует unixtime в миллисекундах в datetime. Это потерянные миллисекунды, но все же очень полезно для фильтрации.
источник
Решение может быть следующим:
источник
@DanielLittle дает самый простой и элегантный ответ на конкретный вопрос. Однако, если вы заинтересованы в преобразовании в определенный часовой пояс И с учетом DST (летнее время), следующее работает хорошо:
Примечание. Это решение работает только на SQL Server 2016 и более поздних версий (и в Azure).
Чтобы создать функцию:
Вы можете вызвать функцию так:
источник