我怎样才能抓住前六个字符,然后将它们转换成 MSSQL 中的日期
How can i grab the first six characters and then convert them into dates in MSSQL
如何拆分以下三个 varchar 列。并抓取某些部分,然后将它们转换为不同的字段,并在其中一个字段上转换为日期时间格式。在 SQL 2012
我希望这样的结果。
- docid, FileName, DealerNo, InvoiceNo, WeekEnding, Doctype, date
1, 123InvoiceIn-044632-15021507129,044632,15021507129,02/15/2015,123InvoiceIn,
如果您注意到 # 1。我能够拆分字段,但现在我还需要转换 invoiceno 的前 6 个字符并将它们格式化为日期字段,该日期字段应为 02/ 15/2015 并将其放在周末。
- docid, FileName, DealerNo, InvoiceNo, WeekEnding, Doctype, date
2, 123InvoiceOut-15022238842-150222, 47158, 15022238842, 02/22/2015, 123InvoiceOut,
如果您注意到 #2 的格式有点不同。我能够拆分字段,但现在我还需要转换 invoiceno 的前 6 个字符并将它们格式化为日期字段,该日期字段应为 02/22/2015 并将其放在周末。
- docid, FileName, DealerNo, InvoiceNo, WeekEnding, Doctype, date
3, 123WrapIn-205251-806-10_04_2013, 205251,806, 123WrapIn, 2013-10-04 00:00.000
如果你注意到#三,我唯一需要做的就是转换文件名列中带有下划线的日期,我需要将其作为日期时间放在日期列中
CREATE TABLE TEST
(
docId int,
FileName NVARCHAR(64),
DealerNo NVARCHAR(64),
InvoiceNo NVARCHAR(64),
WeekEnding NVARCHAR(64),
DocType NVARCHAR(64),
Date DATETIME
);
Insert into TEST (docId, FileName, DealerNo, InvoiceNo, WeekEnding, Doctype, date)
VALUES
(1, '123InvoiceIn-044632-15021507129', '', '', '', '', ''),
(2, '123InvoiceOut-15022238842-150222', '', '', '', '', ''),
(3, '123WrapIn-205251-806-10_04_2010', '', '', '', '', '');
GO
我
试试这个:
SELECT *,
CASE
WHEN t.[FileName] LIKE N'%[-]' + REPLICATE('[0-9]', 11)
THEN CONVERT(DATE, '20' + LEFT(RIGHT(t.[FileName], 11), 6)) -- For <SQL2008 use [SMALL]DATETIME instead of DATE
WHEN t.[FileName] LIKE N'%[-]' + REPLICATE('[0-9]', 6)
THEN CONVERT(DATE, '20' + RIGHT(t.[FileName], 6))
WHEN t.[FileName] LIKE N'%[-][0-9][0-9][_][0-9][0-9][_][0-9][0-9][0-9][0-9]'
THEN CONVERT(DATE, REPLACE(RIGHT(t.[FileName], 10), '_', '/'), 101)
--ELSE NULL -- Unknow format
END AS Date
FROM dbo.TEST t
注意:我假设所有日期都是 >= 2000-01-01
我能够使用自定义函数拆分 SQL 中的列
USE [Test]
GO
/****** Object: UserDefinedFunction [dbo].[SplitStrings_CTE] Script Date: 05/02/2013 11:40:24 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[SplitStrings_CTE](@List nvarchar(max), @Delimiter nvarchar(1))
RETURNS @returns TABLE(val nvarchar(max), [level] int, PRIMARY KEY CLUSTERED([level]))
AS
BEGIN
;WITH cte AS
(
SELECT SUBSTRING(@List, 0, CHARINDEX(@Delimiter, @List)) AS val,
CAST(STUFF (@List + @Delimiter, 1, CHARINDEX(@Delimiter, @List), '') AS nvarchar(max)) AS stval,
1 AS [level]
UNION ALL
SELECT SUBSTRING(stval, 0, CHARINDEX(@Delimiter, stval)),
CAST(STUFF (stval, 1, CHARINDEX(@Delimiter, stval), '') AS nvarchar(max)),
[level] + 1
FROM cte
WHERE stval != ''
)
INSERT @returns
SELECT REPLACE(val, ' ', '') AS val, [level]
FROM cte
RETURN
END
然后使用 SQL 触发器调用函数并使用 SUBSTRING
拆分和格式化日期
;WITH cte AS
(
SELECT t.docid, t.FILENAME, t.DEALERNO, t.INVOICENO, t.WEEK_ENDING, t.DOCTYPE,
NewDOCTYPE = MAX(CASE WHEN o.level = 1 THEN o.val END) OVER(),
NewDEALERNO = MAX(CASE WHEN o.level = 2 THEN o.val END) OVER(),
NewWEEK_ENDING = MAX(CASE WHEN o.level = 3 THEN o.val END) OVER(),
NewINVOICENO = MAX(CASE WHEN o.level = 4 THEN o.val END) OVER()
FROM dbo.test t CROSS APPLY dbo.SplitStrings_CTE(t.FILENAME, '-') o where t.DOCID=@varDOCID
)
Update cte
SET DOCTYPE=NewDOCTYPE,
DEALERNO=NewDEALERNO,
WEEK_ENDING=(SELECT
(
substring(LEFT([NewWEEK_ENDING],6) ,3,2) + '/' +
substring(LEFT([NewWEEK_ENDING],6) ,5,2) + '/' +
substring(LEFT([NewWEEK_ENDING],6) ,1,2)
) )
如何拆分以下三个 varchar 列。并抓取某些部分,然后将它们转换为不同的字段,并在其中一个字段上转换为日期时间格式。在 SQL 2012
我希望这样的结果。
- docid, FileName, DealerNo, InvoiceNo, WeekEnding, Doctype, date
1, 123InvoiceIn-044632-15021507129,044632,15021507129,02/15/2015,123InvoiceIn,
如果您注意到 # 1。我能够拆分字段,但现在我还需要转换 invoiceno 的前 6 个字符并将它们格式化为日期字段,该日期字段应为 02/ 15/2015 并将其放在周末。
- docid, FileName, DealerNo, InvoiceNo, WeekEnding, Doctype, date
2, 123InvoiceOut-15022238842-150222, 47158, 15022238842, 02/22/2015, 123InvoiceOut,
如果您注意到 #2 的格式有点不同。我能够拆分字段,但现在我还需要转换 invoiceno 的前 6 个字符并将它们格式化为日期字段,该日期字段应为 02/22/2015 并将其放在周末。
- docid, FileName, DealerNo, InvoiceNo, WeekEnding, Doctype, date
3, 123WrapIn-205251-806-10_04_2013, 205251,806, 123WrapIn, 2013-10-04 00:00.000
如果你注意到#三,我唯一需要做的就是转换文件名列中带有下划线的日期,我需要将其作为日期时间放在日期列中
CREATE TABLE TEST
(
docId int,
FileName NVARCHAR(64),
DealerNo NVARCHAR(64),
InvoiceNo NVARCHAR(64),
WeekEnding NVARCHAR(64),
DocType NVARCHAR(64),
Date DATETIME
);
Insert into TEST (docId, FileName, DealerNo, InvoiceNo, WeekEnding, Doctype, date)
VALUES
(1, '123InvoiceIn-044632-15021507129', '', '', '', '', ''),
(2, '123InvoiceOut-15022238842-150222', '', '', '', '', ''),
(3, '123WrapIn-205251-806-10_04_2010', '', '', '', '', '');
GO
我
试试这个:
SELECT *,
CASE
WHEN t.[FileName] LIKE N'%[-]' + REPLICATE('[0-9]', 11)
THEN CONVERT(DATE, '20' + LEFT(RIGHT(t.[FileName], 11), 6)) -- For <SQL2008 use [SMALL]DATETIME instead of DATE
WHEN t.[FileName] LIKE N'%[-]' + REPLICATE('[0-9]', 6)
THEN CONVERT(DATE, '20' + RIGHT(t.[FileName], 6))
WHEN t.[FileName] LIKE N'%[-][0-9][0-9][_][0-9][0-9][_][0-9][0-9][0-9][0-9]'
THEN CONVERT(DATE, REPLACE(RIGHT(t.[FileName], 10), '_', '/'), 101)
--ELSE NULL -- Unknow format
END AS Date
FROM dbo.TEST t
注意:我假设所有日期都是 >= 2000-01-01
我能够使用自定义函数拆分 SQL 中的列
USE [Test]
GO
/****** Object: UserDefinedFunction [dbo].[SplitStrings_CTE] Script Date: 05/02/2013 11:40:24 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[SplitStrings_CTE](@List nvarchar(max), @Delimiter nvarchar(1))
RETURNS @returns TABLE(val nvarchar(max), [level] int, PRIMARY KEY CLUSTERED([level]))
AS
BEGIN
;WITH cte AS
(
SELECT SUBSTRING(@List, 0, CHARINDEX(@Delimiter, @List)) AS val,
CAST(STUFF (@List + @Delimiter, 1, CHARINDEX(@Delimiter, @List), '') AS nvarchar(max)) AS stval,
1 AS [level]
UNION ALL
SELECT SUBSTRING(stval, 0, CHARINDEX(@Delimiter, stval)),
CAST(STUFF (stval, 1, CHARINDEX(@Delimiter, stval), '') AS nvarchar(max)),
[level] + 1
FROM cte
WHERE stval != ''
)
INSERT @returns
SELECT REPLACE(val, ' ', '') AS val, [level]
FROM cte
RETURN
END
然后使用 SQL 触发器调用函数并使用 SUBSTRING
;WITH cte AS
(
SELECT t.docid, t.FILENAME, t.DEALERNO, t.INVOICENO, t.WEEK_ENDING, t.DOCTYPE,
NewDOCTYPE = MAX(CASE WHEN o.level = 1 THEN o.val END) OVER(),
NewDEALERNO = MAX(CASE WHEN o.level = 2 THEN o.val END) OVER(),
NewWEEK_ENDING = MAX(CASE WHEN o.level = 3 THEN o.val END) OVER(),
NewINVOICENO = MAX(CASE WHEN o.level = 4 THEN o.val END) OVER()
FROM dbo.test t CROSS APPLY dbo.SplitStrings_CTE(t.FILENAME, '-') o where t.DOCID=@varDOCID
)
Update cte
SET DOCTYPE=NewDOCTYPE,
DEALERNO=NewDEALERNO,
WEEK_ENDING=(SELECT
(
substring(LEFT([NewWEEK_ENDING],6) ,3,2) + '/' +
substring(LEFT([NewWEEK_ENDING],6) ,5,2) + '/' +
substring(LEFT([NewWEEK_ENDING],6) ,1,2)
) )