我正在尝试将字符串转换为日期。该字段是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语句评估字段长度之外,还有另一种方法吗?
答案 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]