SQL конвертировать datetime и вычитать часы

Я пытаюсь преобразовать поле datetime (createTime) из своего стандартного формата 2012-10-06 02: 29: 37.243 в am/pm, поэтому я использую

convert(varchar, CreateTime, 100) as CreateTime

и получить 6 октября 2012 4:29 утра.

Пока что так хорошо, но в том же заявлении я хочу вычесть 4 часа, а затем отобразить поле (вопросы по GMT).

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

Ответ 1

declare @createTime datetime = '2012-10-06 02:29:37.243';

-- original value, default formatting
select @createTime;

-- formatted
select convert(varchar, @createTime, 100);

-- subtract 4 hours, formatted
select convert(varchar, dateadd(hour, -4, @createTime), 100);

Запрос выше, который использует dateadd, всегда будет вычитать 4 часа. Если ваша цель состоит в том, чтобы преобразовать произвольное datetime из UTC в локальное время, тогда это более сложно, потому что смещение, которое вам нужно добавить/вычесть, зависит от исходного datetime. Единственное значение, подобное -4, не всегда будет работать. Вот некоторые идеи для решения общего случая:

Эффективно Преобразование дат между UTC и Local (т.е. PST) в SQL 2005

Ответ 2

Для людей, которые хотят вычесть дни и часы

    declare @createTime datetime = '2012-10-06 02:29:37.243';
select @createtime as originaltime, dateadd(day, -4, dateadd(hour,-1,@createtime))as minus4daysandhour

Ответ 3

Для SQL-сервера вы можете использовать datetimeoffset

Для mysql используйте функцию CONVERT_TZ для преобразования в другую временную зону.