允许在SQL中以零开头的文本格式

时间:2019-07-10 11:54:36

标签: sql sql-server

在使用ms sql server来打印出基于数字的列的前导零时,我目前遇到问题(客户端已采用这种方式设置)。它应该是一种日期类型,但客户已将其设置为数字,因此我正在使用变通方法。

该列的值例如为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 个答案:

答案 0 :(得分:1)

另一个使用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

返回

SomeCol     NewValue
11032019    2019-03-11
8032019     2019-03-08
80219       2019-02-08

答案 1 :(得分:0)

如果您想将数字填充到给定长度,并以前导零填充,那么一种方法是:

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

您也可以使用format()

format(11032019, '0000000000')

或:

format(11032019, 'D10')

答案 2 :(得分:0)

尝试添加100000000(8个零,也可以10个),转换为char并接受最后8个字符

select STUFF(STUFF(right(1000000000 + 8022019,8) ,5,0,'/'),3,0,'/')