【问题标题】:Formatting string as date with leading zeros when needed T-SQL需要时将字符串格式化为带有前导零的日期 T-SQL
【发布时间】:2019-06-03 16:28:08
【问题描述】:

我正在尝试将字符串转换为日期。该字段为 5 或 6 个字符,具体取决于月份。现场样本数据如下:

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

我可以轻松地将年份拉出来 - 左边总是 4 位数。
我如何提取月份数字?除了使用 case/if 语句评估字段长度之外,还有其他方法吗?

【问题讨论】:

  • 月份总是“剩下的”。 SELECT RIGHT('00' + STUFF('20185', 1, 4, ''), 2) -- T-SQL 中任何不能用STUFF 解决的字符串问题都不值得解决。
  • 谢谢!这也有效!非常感谢!
  • A datedaymonthyear,但您只是从 。您对date 的期望是什么date 没有前导零,但可以格式化为没有前导零的字符串。这使得标题和问题有些不一致。

标签: sql tsql sql-server-2016


【解决方案1】:

一种简单的方法是使用datefromparts

DECLARE @Str varchar(10) = '20198'

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

结果:

2019-08-01

SQL Server 会将字符串隐式转换为整数,因此您无需添加前导零。

【讨论】:

【解决方案2】:

你可以使用substring():

select left(yyyym, 4) as yyyy,
       substring(yyyym, 5, 2) as mm

【讨论】:

    【解决方案3】:

    假设列总是 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
    
    
    

    【讨论】:

      【解决方案4】:

      您使用 LEFT 功能的方式,您也可以使用 RIGHT 功能。你只需要从右边找出你想要多少个字符。由于您知道字符串的前 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]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-02
        • 1970-01-01
        • 1970-01-01
        • 2020-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多