Вложенный запрос SQL Server для смещения времени - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь сместить время в столбце на основе часового пояса.Я пытаюсь использовать это:

SELECT 
    SERIAL_NUMBER,
    CONVERT(datetime, TIME_FROM)
      AT TIME ZONE ('US Eastern Standard Time')
FROM 
    tmp_TestZone

, который возвращает то, что мне нужно, однако каждая строка в моей таблице имеет запись с определенным часовым поясом, который может быть любым часовым поясом.Что мне нужно сделать, это заменить «Восточное стандартное время США» на вложенный запрос, в котором будет указан правильный часовой пояс для определенного серийного номера.Часовой пояс хранится в последнем столбце, который TIMEZONE_LU.TZ

Моя таблица выглядит так:

  ,[IP_ADDRESS]
  ,[NAME]
  ,[GROUP_NAME]
  ,[DEVICE_TYPE]
  ,[LINE_NAME]
  ,[DATE_FROM]
  ,[TIME_FROM]
  ,[TIME_TO]
  ,[fw]
  ,[bw]
  ,[SITE_NAME]
  ,[TZ]

Я пытался построить запрос следующим образом:

SELECT
    SERIAL_NUMBER,
    CONVERT(datetime, TIME_FROM)
        AT TIME ZONE (SELECT TZ
                      FROM tmp_TestZone) NEW_TIME
FROM 
    tmp_TestZone

Но я получаю сообщение об ошибке:

Сообщение 512, Уровень 16, Состояние 1, Строка 2
Подзапрос вернул более 1 значения.Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения.

Как это исправить?

Предложение:

SELECT
SERIAL_NUMBER,
CONVERT(datetime, TIME_FROM)
    AT TIME ZONE (SELECT TZ
                  FROM tmp_TestZone) NEW_TIME
FROM 
tmp_TestZone

Работало бы, однако я только что обнаружил, что мои часовые пояса не стандартизированы.Я собираюсь попытаться использовать

  SELECT SERIAL_NUMBER,
  SWITCHOFFSET(TIME_FROM, '-05:00')
   FROM tmp_TestZone2

Не могли бы вы помочь мне заменить '-05: 00' из приведенного выше кода, чтобы он считывал значения из столбца UTC_offset, которые в точном формате, как '-05: 00'

Большое спасибо

Хорошо, вот таблица:

SELECT [SERIAL_NUMBER]
  ,[IP_ADDRESS]
  ,[NAME]
  ,[GROUP_NAME]
  ,[DEVICE_TYPE]
  ,[LINE_NAME]
  ,[DATE_FROM]
  ,[TIME_FROM]
  ,[TIME_TO]
  ,[fw]
  ,[bw]
  ,[SITE_NAME]
  ,[TZ]
  ,[CC]
  ,[UTC_offset]
  ,[UTC_DST_offset]

ОТ [VHA]. [Dbo]. [Tmp_TestZone2]

И вот данные этой таблицы: enter image description here

У меня есть столбцы TIME_FROM и TIME_TO, которые должны быть смещены для значений UTC_Offset.Таким образом, для экземпляра на рисунке TIME_FROM (10:10:00) и TIME_TO (11:00:00) должны быть смещены на -7: 00 и т. Д. Для каждой строки TIME_FROM и TIME_TO должны быть смещены для любого значенияв столбце UTC_Offset.

1 Ответ

0 голосов
/ 18 декабря 2018

Попробуйте вот так

SELECT
    SERIAL_NUMBER,
    CONVERT(datetime, TIME_FROM)
        AT TIME ZONE temp.tz
FROM 
    tmp_TestZone AS temp;

Это может вам помочь.

Отредактированный ответ на вопрос :

Если я правильно понял ваш вопрос, попробуйте следующий запрос, чтобы удалить смещение времени из результата ...

SELECT SERIAL_NUMBER,
CONVERT(varchar(19),SWITCHOFFSET(TIME_FROM, '-05:00'),120) AS Result_date
FROM tmp_TestZone2

ИЛИ

SELECT SERIAL_NUMBER,
CONVERT(varchar(19),SWITCHOFFSET(TIME_FROM, UTC_offset),120) AS Result_date
FROM tmp_TestZone2

Сохранение varchar(19) длины в соответствии с DATETIME CONVERSION CODE (например, 120).

...