允许文本格式的sql中前导零

允许文本格式的sql中前导零,sql,sql-server,Sql,Sql Server,我目前在使用ms sql server打印基于数字的列的前导零(客户机以这种方式设置)时遇到问题。这是一个日期类型,但客户已将其设置为数字,所以我使用的是一个变通方法 如果该列是例如11032019,则可以,但当该列具有例如0803219或8032019的值时,它确实会导致问题 我试图用一个正确的函数来添加'00',但使用mssqlserver却没有用 举个例子: SELECT RIGHT('00'+CONVERT(DATETIME,STUFF(STUFF(13022018,5,0,'/

我目前在使用ms sql server打印基于数字的列的前导零(客户机以这种方式设置)时遇到问题。这是一个日期类型,但客户已将其设置为数字,所以我使用的是一个变通方法

如果该列是例如11032019,则可以,但当该列具有例如0803219或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不接受前导零。如果您想将一个数字填充到给定的长度,并使用前导零,那么一种方法是:

select right(concat(replicate('0', 10), 11032019), 10)
您还可以使用
格式()

或:


只是使用
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
SomeCol     NewValue
11032019    2019-03-11
8032019     2019-03-08
80219       2019-02-08
编辑-丑陋更新

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
尝试添加100000000(8个零,10个也可以),转换为字符,并获取最后8个字符

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

我很困惑。您正在谈论填充一个数字,然后在代码中使用日期/时间。然后引入时间值。你到底想干什么?样本数据和期望的结果真的很有帮助!实际输入的数据类型是什么?文本还是数字?您使用的是数字,但如果有“前导零”,则输入应该是文本<代码>选择转换(DATETIME,STUFF(STUFF('0802219',5,0',/'),3,0',/'),103)效果很好。@Jeroenmoster抱歉,我会更改它,因为它是数字,这是我的错。我大体上会改变的bit@GordonLinoff对此表示歉意,这是一个数字字段输入,客户希望按原样输入,我正在尝试将其作为会计日期输入,如上面的示例所示。我需要输出为:2019-03-11 00:00:00。000@JeroenMostert同样要强调的是,如果我们是文本,我认为“8032019”的例子不适用于我目前的方法。可能需要要求客户机使其数据更“干净”,我仍然希望格式字符串使用
REPLICATE('0',10)
,这样您就不必计数,但是
'D10'
更清晰、更短。谢谢。我尝试过int值,例如13022018,这给了我null@kdawg这看起来像DDMMYYYY如果您的所有数据都是这种格式,那么您可以设置DATEFORMAT Dmyth它作为数字进入数据库,这就是客户机拥有它的方式(处理他们的数据库),但需要将其转换为DATEFORMAT,正如您在输出时所说的那样。我的解决方法是我上面描述的,但它对个位数的日期(即80219或更高)不起作用080219@kdawg你真的需要提供一个合适的样本,不太含糊的日期是8月2日或2月8日。道歉约翰-它的2月..提供数据的问题是它是保密的和客户相关的。我将尝试获取一些示例文件,但请围绕代码添加解释。这样OP和未来的读者就可以很容易地理解你的答案。@SangamBelose,好吗
SomeCol     NewValue
11032019    2019-03-11
8032019     2019-03-08
80219       2019-02-08
select STUFF(STUFF(right(1000000000 + 8022019,8) ,5,0,'/'),3,0,'/')