Luiey Ichigo Ответов: 1

Объединить дату и время в поле целочисленного типа из последней версии SQL server


У меня есть база данных, которая содержит столбец даты и столбец времени..оба находятся в столбце типа INT.

Дата
20160515
20160415
20160315
20160215
20160115
Время
190101
200101
210101
220101
230101

Теперь я хотел бы объединить эти два столбца в один столбец, который будет определяться в запросах. Прямо сейчас у меня есть запросы для преобразования даты и времени в отдельный результат. Как это совместить?

SELECT CAST(STUFF(STUFF(STUFF(RIGHT('00000000' + 
CAST(190101 AS VARCHAR),8),3,0,':'),6,0,':'),9,0,'.') AS TIME) as sqltime

Select Convert(DATETIME, LEFT(20160515, 8)) as currdate


**** Этот SQL будет использоваться в качестве CommandText в программной функции Visual Studio для отправки данных в другую базу данных.
Этот SQL тестируется непосредственно на запросах MSSQL Management Studio перед добавлением в код.

Что я уже пробовал:

SQL: INTEGER TO 24H FORMAT
-------------------------
ВЫБЕРИТЕ CAST (STUFF(STUFF(STUFF (RIGHT ('00000000' +
ЛИТОЙ(190101 КАК VARCHAR),8),3,0,':'),6,0,':'),9,0,'.') Как раз) как sqltime

В SQL: ЦЕЛОЕ ЧИСЛО В ФОРМАТЕ 24Ч ВКЛЮЧАЮТ В МИЛЛИСЕКУНДАХ
-----------------------------------------------
выберите dateadd(час, (190101 / 1000000) % 100,
dateadd (минута, (190101 / 10000) % 100,
dateadd (second, (190101 / 100) % 100,
dateadd (миллисекунда, (190101 % 100) * 10, cast ('00:00:00' as time(2))))))

SQL: ЦЕЛОЕ ЧИСЛО НА СЕГОДНЯШНИЙ ДЕНЬ
--------------------
Выберите Convert (DATETIME, LEFT(20130101, 8)) в качестве currdate

1 Ответов

Рейтинг:
9

Maciej Los

Есть несколько способов достичь этого. Например:

--uncomment below lines to return datetime
--SELECT CONVERT(DATETIME, CONCAT(NewDate, ' ', STUFF(STUFF(NewTime, 3, 0, ':'), 6, 0, ':'))) AS NewDate
--FROM (
	SELECT CONVERT(VARCHAR(10), [Date]) AS NewDate, RIGHT('000000' + CAST([Time] AS VARCHAR(6)), 6) AS NewTime
	FROM @tmp
--) AS t


Возвращается:
2016-05-15 09:59:59.000
2016-04-15 00:00:01.000
2016-05-15 19:01:01.000
2016-04-15 20:01:01.000
2016-03-15 21:01:01.000
2016-02-15 22:01:01.000
2016-01-15 23:01:01.000


Подробнее на: Приведение и преобразование (Transact-SQL)[^]


Luiey Ichigo

Привет, Мацей..

Этот запрос работает только на 6-значном номере как минимум 10: 00: 00 утра, который будет равен 100000. Но если время равно 09: 59:59, а значение в строке равно 095959 или 95959, SQL вернет ошибку "преобразование типа данных varchar в тип данных datetime привело к значению вне диапазона"

Потому что мой клиент преобразует время формата 24 часа в число, которое, если текущее время 00:00:01 (12:00:01PM 12Hr format) данные по строке будут только 1.

Это утверждение работает для того чтобы преобразовать его обратно во время:-
ВЫБЕРИТЕ CAST (STUFF(STUFF(STUFF (RIGHT ('00000000' +
ЛИТОЙ(101 КАК VARCHAR),8),3,0,':'),6,0,':'),9,0,'.') Как раз) как sqltime

Как мне объединить это преобразование времени и преобразование даты, чтобы они были как данные datetime?

Maciej Los

См. обновленный ответ ;)

Luiey Ichigo

Отлично...спасибо!

Maciej Los

Всегда пожалуйста.
Овации,
Мацей