Форматирование строки как даты с ведущими нулями при необходимости T-SQL - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь преобразовать строку в дату. Поле может состоять из 5 или 6 символов, в зависимости от того, какой это месяц. Пример данных с поля выглядит следующим образом:

20185,
20186,
20187,
20188,
20189,
201810,
201811,
201812,
20191,
20192,
20193,
20194

Я легко могу вытащить год - всегда слева 4 цифры.
Как вытащить номер месяца? Есть ли другой способ сделать это, кроме использования оператора case / if, оценивающего длину поля?

Ответы [ 4 ]

2 голосов
/ 03 июня 2019

Один простой способ - использовать datefromparts:

DECLARE @Str varchar(10) = '20198'

SELECT DATEFROMPARTS(
    LEFT(@Str, 4), 
    SUBSTRING(@Str, 5, 2),
    1
    ) As TheDate

результат:

2019-08-01

SQL Server неявно преобразует строки в целые, поэтомувам не нужно возиться с добавлением ведущих нулей.

1 голос
/ 03 июня 2019

Предполагая, что столбец всегда состоит из 5 или 6 символов, вы можете подставить значение, начиная с 5-го индекса.Смотрите мой пример:

CREATE TABLE #temp (datestring VARCHAR(6))
INSERT #temp (datestring) VALUES
(20185), (20186), (20187), (20188), (20189), (201810), (201811), (201812), (20191), (20192), (20193), (20194)


SELECT datestring,SUBSTRING(datestring, 5, LEN(datestring))
FROM #temp

DROP TABLE #temp


1 голос
/ 03 июня 2019

Вы можете использовать substring():

select left(yyyym, 4) as yyyy,
       substring(yyyym, 5, 2) as mm
0 голосов
/ 03 июня 2019

Как вы использовали функцию ВЛЕВО, вы также можете использовать ВПРАВО.Вам просто нужно узнать, сколько символов вы хотите с правой стороны.Поскольку вы знаете, что первые 4 символа строки будут годом, вы можете вычесть длину строки с помощью 4.

Вот пример.

DECLARE @Str_Date VARCHAR(6) = '201810'

SELECT LEFT(@Str_Date, 4) [Year], RIGHT(@Str_Date, LEN(@Str_Date)-4) [Month]

GO 

DECLARE @Str_Date VARCHAR(6) = '20185'

SELECT LEFT(@Str_Date, 4) [Year], RIGHT(@Str_Date, LEN(@Str_Date)-4) [Month]
...