VICK Ответов: 1

AM PM time Conversation в SQL Server из строки


Всем привет,

После того, как я много погуглил, я только что приземлился на CP в поисках какого-то руководства для решения моей проблемы.

Мы экономили время в нашей таблице, как 11:33 утра в таблице как 1133.теперь я хочу, чтобы получить его обратно в надлежащем формате времени, то есть в формате AM PM, чтобы использовать в нашем приложении.

Может любой орган, руководство??

:)

Thanks7872

Значит, у вашего приложения нет переднего плана?

VICK

Вне источника это так.. Я показываю эти данные в отчете RDLC. и Properites>Number>Time вариант не работает оттуда.

André Kraak

Как вы храните 11:33 ПОСЛЕ ПОЛУДНЯ?

VICK

данные поступают в обычный текстовый файл, например 1133 или 2244, и хранятся в БД непосредственно через запланированное задание и процедуру.

Maciej Los

Если вы хотите получить полный ответ, вы должны предоставить более подробную информацию о типе данных (включая примеры данных) и более подробную информацию о проблеме.

VICK

ну а данные в таблице-это varchar.. и из этого я хочу получить формат времени. Это достаточно подробно?

Mike Meinz

Значения даты и времени всегда должны храниться в базе данных в соответствующем типе данных. Это наилучшая практика. Это сводит к минимуму программирование для вычислений и отображения значений даты и времени. Это предотвращает ошибки. Не делать этого-непрофессионально!

1 Ответов

Рейтинг:
10

Maciej Los

Пожалуйста, сначала прочтите мой комментарий.

Как правило, для преобразования данных из одного типа в другой, пожалуйста, используйте: Приведение и преобразование (Transact-SQL)[^]

[РЕДАКТИРОВАТЬ]
Ответьте на комментарий op. Нет, это недостаточная информация. Существует несколько версий MS SQL Server. Некоторые из них не предоставляют тип данных time.

DECLARE @t VARCHAR(30) = '1133'

SELECT LEFT(@t,2) + ':' + RIGHT(@t,2) + ' AM' AS MyTimeAsString

SELECT CONVERT(TIME, MyTimeAsString) AS MyTimeAsTime
FROM (
    SELECT LEFT(@t,2) + ':' + RIGHT(@t,2) + ' AM' AS MyTimeAsString
    ) AS T

SELECT CONVERT(DATETIME, MyTimeAsString) AS MyTimeAsDateTime
FROM (
    SELECT LEFT(@t,2) + ':' + RIGHT(@t,2) + ' AM' AS MyTimeAsString
    ) AS T


Результаты:
MyTimeAsString
11:33 AM

MyTimeAsTime
11:33:00.0000000

MyTimeAsDateTime
1900-01-01 11:33:00.000


Это то, чего ты хочешь?
[/РЕДАКТИРОВАТЬ]

[Править 2]
CREATE FUNCTION udf_FormatTime (@sTime VARCHAR(10))
    RETURNS VARCHAR(15)
AS
BEGIN
    DECLARE @sTimeFormat VARCHAR(15)

    IF LEN(@sTime) = 0
        SET @sTimeFormat = '00:00 AM'
    ELSE
        SET @sTimeFormat = LEFT(@sTime, 2) + ':' + RIGHT(@sTime, 2) 
    
    IF CONVERT(INT, LEFT(@sTimeFormat,2))<13 
        SET @sTimeFormat = @sTimeFormat + ' AM'
    ELSE
       SET @sTimeFormat = @sTimeFormat + ' PM'
    
RETURN @sTimeFormat
END


[/EDIT 2]


coded007

Мацей Лос я пытался это сделать, но не получилось. Я думаю, что нам нужно дать какой-то пользовательский код, чтобы преобразовать это

Maciej Los

Что не работает? Вы читали мой комментарий первым? Поскольку OP не предоставляет достаточной информации, мой ответ заключается в том, как конвертировать данные между типами данных.

VICK

Спасибо Мацей Лос... меня оправдали.. ну, я использую SQL Server 2008 Enterprise.

VICK

Хотя это не решило мою проблему.. как его просто добавление : между строкой и добавлением жестко закодированного AM в конце.. но все же это дает мне какой-то намек.

Maciej Los

Я предлагаю вам изменить тип данных на time или datetime, в зависимости от ваших потребностей ;)
Не могли бы вы, пожалуйста, отметить это решение как ответ (зеленая кнопка)?

VICK

Не Обижайся... Но

Ну, как я уже упоминал в своем комментарии выше, что делает ваше представленное решение, кроме той ссылки MSDN, которую я нашел на первой странице поиска google.
это не совсем то, что может помочь решить мою проблему. :(

Так что будем ждать другого решения.

Maciej Los

Это твое решение ;)
MS SQL Server 2012 предоставляет TimeFromParts[^] функция. Вы можете писать пользовательская функция[^]. ;)
Смотрите мой ответ сейчас ;)

VICK

ОШИБКА.... :(


Msg 137, Level 15, State 2, Procedure udf_FormatTime, Line 10
Must declare the scalar variable "@sPhone".
Msg 156, Level 15, State 1, Procedure udf_FormatTime, Line 12
Incorrect syntax near the keyword 'ELSE'.

VICK

после объявления @sPhone .. теперь получаю это.


Msg 2714, Level 16, State 3, Procedure udf_FormatTime, Line 15
There is already an object named 'udf_FormatTime' in the database.

Maciej Los

Проверь сейчас. Чтобы обновить функцию udf_FormatTime, вам нужно заменить CREATE word на ALTER ;)

VICK

Хм... верно ... пробовал, но хорошо, что это делает то же самое ... если я передам 1133 в качестве параметра этой функции после alter... он возвращает 11:33 утра.. в то время как если я передам 2244.. dn, он также вернет 22:44 утра с этим.

так что не работает как стандартный сценарий AM PM..

Maciej Los

Это была примерная функция. Вам нужно добавить дополнительные условия...
Пожалуйста, смотрите обновленный ответ.

VICK

ладно. Спасибо за сотрудничество.

Maciej Los

Пожалуйста ;)