2011-01-10 2 views
0

у меня будет целое число, рассчитанное из DateDiff()INT в формате чч: мм: сс сс в SQL Server

давайте говорить .. это ..

declare @earliestTime int; 
set @earliestTime=50000000; 

Я хочу, чтобы преобразовать в чч: мм: сс тт

у меня есть этот код, чтобы преобразовать что ИНТ в чч: мм: сс

CONVERT(varchar(6), (@earliestTime)/60)+ ':' + RIGHT('0' + CONVERT(varchar(2), ((@earliestTime) % 60)), 2)+ ':' + RIGHT('0' + CONVERT(varchar(2), ((@earliestTime) %60)*0), 2) 

Как я могу изменить его в формате чч: мм: сс сс (AM или PM)

я изменил, как это ..

CONVERT(varchar(6), 
case 
when 
((@earliestTime)/60)<=12 
then 
((@earliestTime)/60) 
else 
(((@earliestTime)/60)-12) 
end) 

--CONVERT(varchar(6), case when((@earliestTime)/60)<=12 then (@earliestTime)/60 else ((@earliestTime)/60)-12) 
+ 
':' 
+ 
RIGHT('0' + CONVERT(varchar(2), ((@earliestTime) % 60)), 2) 
+ 
':' 
+ 
RIGHT('0' + CONVERT(varchar(2), ((@earliestTime) %60)*0), 2 
+ 
' ' 
+ 
convert(varchar(2),(case when ((@earliestTime)/60)<12 then 'am' else 'pm' end))) 

Но это дает мне эту ошибку ..

Конверсия удалось при преобразовании значение VARCHAR 'Pm' к типу данных междунар.

Я уже конвертировал 'pm' или 'am' в varchar (2). почему система все еще дает мне эту ошибку?

Как сделать его правильным или есть лучший способ?

+2

Что задает целое число? секунд между двумя датами, часами, что? –

+0

да .. секунд между 2-х раз – william

ответ

2

Вы не объясните, что представляет собой ваше целое число, поэтому трудно дать ответ.

Лучше всего использовать правильный тип данных для времени. Я бы использовал DATETIME - он позволит вам выполнять вычисления, сортировать и форматировать по мере необходимости. Хранение времени, так как текст позже будет вызывать головные боли.

Хранить время путем добавления времени к SQL эпохи (1900-01-01 00:00:00), как и

SELECT DATEADD(SECOND, 50000, CONVERT(DATETIME, 0.0)) 
SELECT DATEADD(MINUTE, 50000, CONVERT(DATETIME, 0.0)) 

Затем форматировать DATETIME объект соответствующим образом.

  • Чтобы получить чч: мм: сс, используйте формат 108.
  • Чтобы получить флаг AM/PM, используйте 100 и возьмите две крайние правые символы.

Попробуйте ниже:

DECLARE @date DATETIME 
SET @date = DATEADD(SECOND, 50000, CONVERT(DATETIME, 0.0)) 
SELECT CONVERT(VARCHAR, DATEPART(HOUR, @date)%12) 
    + ':' + RIGHT(CONVERT(VARCHAR, @date, 108),5) 
    + RIGHT(CONVERT(VARCHAR, @date, 100), 2) 

Я хотел бы также отметить, что вы работаете в базе данных, а не презентации слоя. Не нужно беспокоиться о датах и ​​времени форматирования в базе данных; речь идет о хранении и извлечении данных. Предположительно, вы возвращаетесь на этот раз к приложению или веб-странице, которые должны быть помещены на экран, в отчет или что-то еще - лучше всего хранить данные как полные DATETIME и позволить верхнему слою его форматировать. При преобразовании в VARCHAR вы просто удаляете информацию и ограничиваете себя; нет выгоды, много затрат.

+0

вы последние 3 строки дайте мне это .. 13:53:20 PM не предполагается ли это b 1:53:20? – william

+0

Вы правы - вам нужно играть со строками формата, чтобы получить лучшую комбинацию.Это будет работать, хотя вы можете найти более простую комбинацию 'CONVERT (VARCHAR, DATEPART (HOUR, @date)% 12) + ':' + RIGHT (CONVERT (VARCHAR, @date, 108), 5) + RIGHT (CONVERT (VARCHAR, @date, 100), 2) ' –

+0

Я обновил свой ответ, чтобы показать 12 часов вместо 24-часового времени. –

Смежные вопросы