Разрешение начального нуля в sql для текстового формата - PullRequest
1 голос
/ 10 июля 2019

В настоящее время у меня возникают проблемы при использовании сервера MS SQL для распечатки начальных нулей для столбца на основе чисел (который клиент настроил таким образом). Предполагается, что это тип даты, но клиент настроил его как число, поэтому я использую обходной путь.

Это нормально, если этот столбец, например, 11032019, но это вызывает проблемы, когда столбец имеет значение, например, 08032019 или 8032019

Я попытался дополнить его правильной функцией, чтобы добавить '00', но это бесполезно при использовании mssqlserver.

Например, что-то вроде этого:

SELECT
    RIGHT('00'+CONVERT(DATETIME,STUFF(STUFF(13022018,5,0,'/'),3,0,'/') , 103),0)

CONVERT(DATETIME,STUFF(STUFF(11032019,5,0,'/'),3,0,'/') , 103)

Вышесказанное работает хорошо, но проблема заключается в следующем, если он имеет начальный 0 или как показано ниже

CONVERT(DATETIME,STUFF(STUFF(8022019,5,0,'/'),3,0,'/') , 103)

Я думаю, что я близок к тому, что мне нужно, он должен выводить для примера, который работает 2019-03-11 00: 00: 00.000

но для того, кто не работает, он просто выдает ошибку преобразования не удалось, и я проверил, что из-за начального нуля не принимается MS SQL

Ответы [ 3 ]

1 голос
/ 10 июля 2019

Просто еще один вариант с использованием left() и right(). Это также работает, если значения были INT.

Пример

Declare @YourTable table (SomeCol varchar(25))
Insert Into @YourTable values
 ('11032019')
,('08032019')
,('8032019')


Select *
      ,NewValue = try_convert(date
                             ,right(SomeCol,4)
                             +left(right('00'+SomeCol,8),4)
                             )
 From  @YourTable

Возвращает

SomeCol     NewValue
11032019    2019-11-03
08032019    2019-08-03
8032019     2019-08-03

РЕДАКТИРОВАТЬ - Уродливое обновление

Declare @YourTable table (SomeCol int)
Insert Into @YourTable values
 (11032019)
,(8032019)
,(80219)

Set DateFormat DMY

Select *
      ,NewValue = try_convert(date,
                  stuff(right('0'+left(SomeCol,len(SomeCol)-len(right(SomeCol,IIF(Len(SomeCol)<7,2,4)))),4),3,0,'/')
                + '/'
                + right(SomeCol,IIF(Len(SomeCol)<7,2,4))
                )
 From  @YourTable

Returns

SomeCol     NewValue
11032019    2019-03-11
8032019     2019-03-08
80219       2019-02-08
0 голосов
/ 10 июля 2019

Попробуйте добавить 100000000 (8 нулей, 10 тоже нормально), конвертировать в char и взять последние 8 символов

select STUFF(STUFF(right(1000000000 + 8022019,8) ,5,0,'/'),3,0,'/')
0 голосов
/ 10 июля 2019

Если вы хотите добавить число к заданной длине с ведущими нулями, то один из методов:

select right(concat(replicate('0', 10), 11032019), 10)

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

format(11032019, '0000000000')

или:

format(11032019, 'D10')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...