必要时,将字符串格式化为带有前导零的日期格式的T-SQL

时间:2019-06-03 16:28:08

标签: sql tsql sql-server-2016

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

DECLARE @S1 NVARCHAR(10) = '2';
DECLARE @S2 NVARCHAR(10) = '²';
DROP TABLE IF EXISTS #Test;
CREATE TABLE #Test(S NVARCHAR(10) NOT NULL);
CREATE UNIQUE INDEX I1 ON #Test(S);
INSERT #Test SELECT @S1;
INSERT #Test SELECT @S2;

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

4 个答案:

答案 0 :(得分:2)

一种简单的方法是使用datefromparts

DECLARE @Str varchar(10) = '20198'

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

结果:

2019-08-01

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

答案 1 :(得分:1)

您可以使用substring()

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

答案 2 :(得分:1)

假设该列始终为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


答案 3 :(得分:0)

使用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]