Как мне преобразовать значение после использования DATEADD с ним - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть небольшой запрос, который удаляет дату из поля datetime, но когда я пытаюсь преобразовать его из GMT в CST, он считывает дату. Есть ли лучший способ сделать это?

Таблица расположений:

arrival
4-6-2018 12:35:43




SELECT arrival
FROM(
SELECT CONVERT(VARCHAR(8), arrival))
FROM locations
)a

Этот запрос даст мне такой результат:

12: 35: 43

SELECT (DATEADD(hour,-5,arrival))
FROM(
SELECT CONVERT(VARCHAR(8), arrival))
FROM locations
)a

4-6-2018 12: 35: 43

Этот запрос даст дату чтения. Как я могу удалить дату, а затем выполнить функцию dateadd, не читая дату

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

Вероятно, это то, что вы просите:

SELECT Convert(Varchar(8), DATEADD(hour,-5,arrival), 108)
FROM locations;

Примечание. Это совместимо с версиями сервера SQL, которые также не имеют тип данных Time.

0 голосов
/ 27 апреля 2018

Цитировать из DATEADD (Transact-SQL) - Типы возврата :

Тип возвращаемых данных - это тип данных аргумента даты, за исключением строковых литералов. Возвращаемый тип данных для строкового литерала - datetime . Ошибка будет возникать, если строковый буквенный масштаб секунд превышает три позиции (.nnn) или содержит часть смещения часового пояса.

Подчеркни мое.

Когда вы передаете строку (varchar), то DATEADD возвращает datetime.

Как и в комментариях, если вы используете правильный тип данных (time), эта проблема исчезнет:

SELECT DATEADD(HOUR, -5,CONVERT(time,Arrival))
FROM (VALUES('4-6-2018 12:35:43'),('4-6-2018 07:35:43'),('4-6-2018 03:35:43')) V(Arrival)
0 голосов
/ 27 апреля 2018

arrival, похоже, DateTime, который всегда содержит часть даты. Вместо этого вам потребуется time, поддерживаемый SQL Server 2008 +:

cast(DATEADD(hour,-5,arrival) as time)
...