Как добавить час в метку времени на сервере SQL (без объявления) - PullRequest
0 голосов
/ 01 марта 2019

Я хочу добавить час в параметре TimeStamp, но не с объявленным параметром, т.е.

DECLARE @datetime2 datetime2 = '2019-03-01T09:25:21.1+01:00'
                SELECT DATEADD(hour,1,@datetime)

У меня есть имя столбца TimeStamp в таблице, и я хочу добавить все данные плюс 1 час.

Столбец

TimeStamp 
2019-03-01T09:25:20.1+01:00
2019-03-01T09:25:21.1+01:00
2019-03-01T09:25:19.1+01:00

Я пытаюсь что-то вроде этого

SELECT DATEADD(hour,1, TimeStamp), but i have an error 

Ошибка преобразования при преобразовании даты и / или времени из строки символов.

Любые возможные ответы ??Спасибо

Ответы [ 6 ]

0 голосов
/ 01 марта 2019

В соответствии с этим https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql?view=sql-server-2017#date-and-time-styles необходимо преобразовать временную метку с часовым поясом, используя тип 127.

127 - это формат ввода для:

ISO8601 с часовым поясомZ.

гггг-мм-ддThh: mi: ss.mmmZ (без пробелов) Примечание. При значении 0 в миллисекундах (ммм) десятичное значение в миллисекундах не отображается.Например, значение «2012-11-07T18: 26: 20.000» будет отображаться как «2012-11-07T18: 26: 20».

select convert(datetime2, '2019-03-01T09:25:20.1+01:00', 127)

, если вы не используете convertи 127 с помощью cast вы можете столкнуться с проблемами конвертации в зависимости от языковых настроек пользователей.

0 голосов
/ 01 марта 2019

Может быть, вы после этого?

 select dateadd(hour,1,convert(datetimeoffset, TimeStamp))

Лучше не хранить даты и время в виде текста.

Редактировать: Обратите внимание, что он сохранит информацию о вашем часовом поясе, если это важнотебе.

0 голосов
/ 01 марта 2019

В вашей отметке времени + 01: 00 представляет собой сдвиг времени по Гринвичу.Вы можете преобразовать это в ваше местное время, а затем добавить часы, используя DATEADD ()

или удалить смещение времени из строки и добавить один час, используя DATEADD (), как предложено другими.

0 голосов
/ 01 марта 2019

SELECT DATEADD (часы, 1, метка времени) верны

Однако формат в метке времени неправильный,

Итак, приведите его к DateTime2 Сначала

CAST(TimeStamp as DateTime2)

ИЛИ

CAST('2019-03-01T09:25:20.1+01:00' as DateTime2)

Итак,

SELECT DATEADD(hour, 1, CAST(TimeStamp as DateTime2))
0 голосов
/ 01 марта 2019

Ошибка преобразования при преобразовании даты и / или времени из символьной строки.

Сообщение об ошибке означает, что столбец TimeStamp сохранен в виде строки.DATEADD ожидает допустимое значение, которое является date / datetime / datetime2 или может быть преобразовано в него из строки.Поскольку примерное значение выглядит как DATETIME2, возможно, необходимо дополнительное преобразование:

SELECT DATEADD(hour,1, CAST(TimeStamp as datetime2))
0 голосов
/ 01 марта 2019

Ваш синтаксис будет в порядке, как определено.

Это может быть значение в вашем столбце, которое не может проанализировать datetime2, поскольку оно содержит недопустимый символ.Вы можете добавить ISDATE () к выражению, чтобы проверить, действительно ли оно.https://docs.microsoft.com/en-us/sql/t-sql/functions/isdate-transact-sql?view=sql-server-2017

edit: забыл упомянуть, что вы можете анализировать перед добавлением с помощью try_cast или try_convert к datetime2

...