【问题标题】:Allowing leading zero in sql for a text format允许在 sql 中为文本格式前导零
【发布时间】:2019-07-10 23:02:04
【问题描述】:

我目前在使用 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 不接受前导零

【问题讨论】:

  • 我很困惑。您正在谈论填充数字,然后您在代码中使用日期/时间。然后你引入时间值。你真正想做什么?样本数据和期望的结果真的很有帮助!
  • 您的实际输入的数据类型是什么——文本还是数字?您使用的是数字,但如果您有“前导零”,则输入应该是文本。 SELECT CONVERT(DATETIME,STUFF(STUFF('08022019',5,0,'/'),3,0,'/') , 103) 工作得很好。
  • @JeroenMostert 道歉我会改变它,因为它是数字,那是我的错。我将在主要部分更改它
  • @GordonLinoff 对此表示歉意,它是客户想要的数字字段输入,我正试图将其设置为一个日期作为其会计日期,如上例所示。我需要输出为:2019-03-11 00:00:00.000
  • @JeroenMostert 还要强调如果我们是文本,我认为“8032019”示例不适用于我当前的方法。也许可能需要要求客户让他们的数据更“干净”

标签: sql sql-server


【解决方案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

【讨论】:

  • 谢谢。我尝试过使用 int 的值,例如 13022018,这给了我 null
  • @kdawg 看起来像 DDMMYYYY 如果你的所有数据都是这种格式,你可以设置 DATEFORMAT DMY
  • 问题是它以数字的形式进入数据库,这就是客户拥有它的方式(在他们的数据库上工作),但需要按照您在输出时所说的那样将其转换为日期格式。我的解决方法是我上面描述的那个,但它不适用于单个数字日期,即 80219 甚至 080219
  • @kdawg 您确实需要提供一个适当的样本,并且不太模糊的日期是 0802 年 8 月 2 日或 2 月 8 日。
  • 向 John 道歉 - 2 月 .. 提供数据的问题在于它是机密的并且与客户相关。不过我会尝试获取一些示例文件
【解决方案2】:

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

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

你也可以使用format():

format(11032019, '0000000000')

或:

format(11032019, 'D10')

【讨论】:

  • 我还是更喜欢 REPLICATE('0', 10) 作为格式字符串,这样你就不必数了,但 'D10' 更清晰、更短。
【解决方案3】:

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

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

【讨论】:

  • 请在您的代码周围添加解释。以便 OP 和未来的读者可以轻松理解您的答案。
  • @SangamBelose,好的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
  • 2010-10-25
  • 1970-01-01
  • 2018-09-13
  • 2013-07-19
  • 1970-01-01
  • 2017-04-26
相关资源
最近更新 更多