我怎样才能抓住前六个字符,然后将它们转换成 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) 

 ) )