Преобразовать метку времени BigInt в дату в SQL - PullRequest
0 голосов
/ 04 октября 2019

У меня проблема с преобразованием и приведением типа. У меня есть поле с типом данных BigInt, значение которого хранится в формате "ггггммдччммсс", например "20170609043000". Я пытаюсь получить подстроку даты в метке времени, например 20170609, с разделителем 2017-06-09. Не удалось получить часть даты в метке времени.

Запрос Я попытался получить часть даты:

SELECT CONVERT(date,SUBSTRING(CAST(STR(evt.StartDate,15) as varchar),1, 5), 102) from Event evt

SELECT DATEADD(hour,-5, CONVERT(datetime, SUBSTRING(CAST(STR(evt.StartDate, 15) as varchar),6, 2) + '-' + SUBSTRING(CAST(STR(evt.StartDate, 15) as varchar), 8, 2) + '-' + SUBSTRING(CAST(STR(evt.StartDate, 15) as varchar), 1,5) + ' ' + SUBSTRING(CAST(STR(evt.StartDate, 15) as varchar),10, 2) + ':' +SUBSTRING(CAST(STR(evt.StartDate, 15) as varchar), 12, 2) + ':' + SUBSTRING(CAST(STR(evt.StartDate, 15) as varchar), 14, 2), 120)) from Event evt

Первый запрос возвращает преобразованную дату, но месяц и дата остаются неизменными,конкатенация не работает, если я пытаюсь ввести месяц и дату.

Второй запрос вообще не работает.

Любая помощь будет полезна.

Ответы [ 2 ]

2 голосов
/ 04 октября 2019

Почему бы просто не взять 8 самых левых символов и преобразовать их?

SELECT CONVERT(date, LEFT(20170609043000,8));

В идеале вам следует использовать тип данных даты и времени для хранения данных даты и времени. Хранение их в другом типе данных только приводит к возникновению проблем и никогда не решает проблему, которая не может быть решена где-либо еще (так называемый уровень представления).

1 голос
/ 04 октября 2019

Ваш второй запрос почти верен, но получает год, месяц и дату в неправильном порядке. Попробуйте вместо этого:

SELECT CONVERT(datetime, SUBSTRING(CAST(STR(evt.StartDate, 15) as varchar),2, 4) + '-' + 
                         SUBSTRING(CAST(STR(evt.StartDate, 15) as varchar), 6, 2) + '-' + 
                         SUBSTRING(CAST(STR(evt.StartDate, 15) as varchar), 8,2) + ' ' + 
                         SUBSTRING(CAST(STR(evt.StartDate, 15) as varchar),10, 2) + ':' + 
                         SUBSTRING(CAST(STR(evt.StartDate, 15) as varchar), 12, 2) + ':' + 
                         SUBSTRING(CAST(STR(evt.StartDate, 15) as varchar), 14, 2), 120) 
FROM Event evt

Вывод:

09/06/2017 04:30:00

Демонстрация на dbfiddle

...