SQL конвертирует int во время - PullRequest
       11

SQL конвертирует int во время

3 голосов
/ 15 сентября 2010

У меня есть база данных, которая отображает время в виде целого числа. Однако я хочу вывести это в отчет в правильном формате. Это формат, который я хотел бы изменить:

например.

183000 станет 18:30 500 станет 00:05 160000 станет 16:00

и так далее.

Я посмотрел CAST и CONVERT, но мне не удалось получить время в правильном формате.

Ответы [ 4 ]

3 голосов
/ 15 сентября 2010

Предполагая, что ваш ввод всегда будет целым, вы можете проанализировать его следующим образом:

DECLARE @stringTime varchar(6)

SET @stringTime =  RIGHT('000000' + CAST(intTime AS VARCHAR), 6)

SELECT CAST(LEFT(@stringTime, 2) + ':' + RIGHT(LEFT(@stringTime, 4), 2) AS TIME) as TimeValue

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

Использование значения int таким способом позволяет получить много неверных данных, без добавления дополнительных проверок и / или ограничений на ваши входные данные (т.е.: 260000, 127900 и т. Д.)

3 голосов
/ 15 сентября 2010

похоже, что вам нужно разделить на 100, чтобы получить секунды, разделить на 10000, чтобы получить минуты, и разделить на 1000000, чтобы получить часы, затем отформатируйте эти значения в виде строки, вставив двоеточие между часами и минутами, например

чч: мм

2 голосов
/ 15 сентября 2010

Сначала приведите к полю varchar и преобразуйте все время в 4 цифры, добавив, если необходимо, начальные нули (500 станет 0500), а затем разбейте поле с помощью конкатенации Left (myfield, 2) + ':' + right (myfield, 2)

Это глупо делать каждый раз, когда вы запускаете отчет, это тратит ресурсы сервера.Если возможно, измените поле на varchar и введите код один раз.Если это невозможно, вы можете добавить отформатированное поле и сделать триггер для форматирования при вставке (вам все равно нужно будет обновить поле в первый раз? Возможно, вместо триггера будет действовать ограничение, но это будет зависеть от базы данных..

1 голос
/ 15 сентября 2010

Я предполагаю, что вы используете SQL Server на основе использования CONVERT и ваших предыдущих вопросов.

Вы также можете использовать DATEADD для этого.

WITH Times AS
(
SELECT 183000 AS T 
UNION ALL 
SELECT 500 
UNION ALL  
SELECT 160000 

)
SELECT CAST(DATEADD(SECOND, T%100 + (60*(T%10000 / 100)) + 3600*(T/10000),0)
            AS time /*Or datetime if < SQL Server 2008*/)
FROM Times
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...