Пожалуйста, помогите мне построить быстрый / оптимизированный T-SQL для преобразования 12-часовых часов в 24-часовые часы - PullRequest
0 голосов
/ 14 июня 2011

У меня таблица содержит только 2 столбца (время и AMPM).оба столбца являются NVARCHAR.

Время ...... AMPM

07: 30 ..... AM

08: 45 ..... PM

12: 00 ..... PM

01: 00 ..... PM

12: 00 ..... AM

Мне нужно собрать t-sql для преобразования вышеуказанных данных в

Время

07: 30

20: 45

12: 00

13: 00

00: 00

Как вы, наверное, знаете, я хочу преобразовать 12-часовые часы в 24-часовые часы в произвольном формате строки.Теперь мне нужно преобразовать столбец времени в переменную datetime и снова преобразовать в 12-часовую систему часов, потому что я не хочу разбивать строку и затем выполнять сложение / вычитание.

Пожалуйста, предложите / проведите меня для оптимизированнойТ-sql, чтобы сделать это.я не могу выполнить эту задачу в коде из-за некоторых ограничений.я был вынужден сделать это только на SQL SERVER 2005/2008.

спасибо за объявление и извините за ломаный английский.

vcha

Ответы [ 3 ]

1 голос
/ 14 июня 2011

Извините, но не очень понятно, что вы ищете здесь. Какой тип данных содержит время? Какой тип данных (или формат строки) вы пытаетесь создать? Без них вопрос очень открыт для (неправильной) интерпретации.

С учетом сказанного, некоторые рекомендации, которые могут помочь:

  • Преобразование ваших данных (при необходимости) в соответствующий тип данных даты / времени
  • SQL 2008 имеет тип данных Time. Если вы можете, используйте это для простоты
  • Используйте функцию DATEADD, если / когда вы добавляете 12 часов к времени запуска. Используйте это, чтобы добавить 12 часов к вашему (конвертированному) времени для данных PM.

Но ... правильно настроить 12:00 AM или PM будет сложно. С одной стороны, 12:00 (то есть полночь) представляется в 24 часа как 00:00, что может или не может быть тем, что вы хотите. Но если вы берете 12:00 вечера и (как указано выше) добавляете 12 часов для «PM», вы получаете полночь, а это не то, что вам нужно. Скорее всего, вам придется сделать что-то хитрое с оператором CASE. Вот пример, основанный на том, что у меня было до того, как я понял, что не могу завершить запрос:

  ,dateadd(hh
           ,case
              when SomeTime = '12:00' and AM_PM = 'PM' then 0
              when SomeTime = '12:00' and AM_PM = 'AM' then 12
              when AM_PM = 'AM' then 0
              else 12  --  PM
            end
           ,cast(SomeTime as time))
1 голос
/ 15 июня 2011

Нельзя использовать тип данных Time, если вы хотите поддерживать MS SQL 2005. Мое решение использует несколько преобразований:

-- test data:
SELECT '07:30' AS Time, 'AM' AS AMPM
INTO testTime
UNION ALL 
SELECT '08:45' AS Time, 'PM'
UNION ALL 
SELECT '12:00' AS Time, 'PM'
UNION ALL 
SELECT '01:00' AS Time, 'PM'
UNION ALL 
SELECT '12:00' AS Time, 'AM'
UNION ALL 
SELECT '07:15' AS Time, 'AM'

-- Final query
SELECT TIME, AMPM , 
       CASE WHEN AMPM = 'PM' THEN 
         CAST( CAST(LEFT(Time, 2) AS int) + 12 AS varchar)+substring(Time, 3, 3) 
       ELSE 
         Time 
       END
FROM testTime
0 голосов
/ 14 июня 2011

Я создал таблицу с именем 12HourClock, которая содержит столбцы, которые вы указали в своем примере.

SELECT LEFT(CAST(CONVERT(time, [Time] + ' ' + AMPM, 8) AS nvarchar(5)), 5) AS 'Time'
FROM [12HourClock]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...