Sql server 如何获取前六个字符,然后将它们转换为MSSQL中的日期

Sql server 如何获取前六个字符,然后将它们转换为MSSQL中的日期,sql-server,sql-server-2012,Sql Server,Sql Server 2012,如何拆分以下三个varchar列。抓取某些部分,然后将它们转换为不同的字段,并在其中一个字段上转换为日期时间格式。在SQL 2012中 我希望结果是这样的 - docid, FileName, DealerNo, InvoiceNo, WeekEnding, Doctype, date 123InvoiceIn-044632-150215071290463215021507129,02/15/2015123 INVOICEIN 如果你注意到1。我可以拆分字段,但现在我还需要将发票编号的前6

如何拆分以下三个varchar列。抓取某些部分,然后将它们转换为不同的字段,并在其中一个字段上转换为日期时间格式。在SQL 2012中

我希望结果是这样的

-   docid, FileName, DealerNo, InvoiceNo, WeekEnding, Doctype, date
123InvoiceIn-044632-150215071290463215021507129,02/15/2015123 INVOICEIN

如果你注意到1。我可以拆分字段,但现在我还需要将发票编号的前6个字符转换为日期字段,日期字段应为2015年2月15日,并将其放在周末

- docid, FileName, DealerNo, InvoiceNo, WeekEnding, Doctype, date
- docid, FileName, DealerNo, InvoiceNo, WeekEnding, Doctype, date
123InvoiceOut-15022238842-1502224715815022238422015年2月22日,123InvoiceOut

如果你注意到2的格式有点不同。我可以拆分字段,但现在我还需要将发票的前6个字符转换为日期字段,日期字段应为2015年2月22日,并将其放在周末

- docid, FileName, DealerNo, InvoiceNo, WeekEnding, Doctype, date
- docid, FileName, DealerNo, InvoiceNo, WeekEnding, Doctype, date
123WrapIn-205251-806-10_04_2013,20521806123WRAPIN,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触发器调用函数,并使用子字符串拆分和格式化日期


你可以用charindex和substring把字符串去掉,但是这看起来有很多错误和错误的日期等着你去做…你可以用try_convert至少来保护自己不受演员错误的影响,以防你试图转换字符串的错误部分你对我的答案有什么疑问吗?