如何在ssis中将2016年12月14日06.23.37.000转换为日期时间

如何在ssis中将2016年12月14日06.23.37.000转换为日期时间,ssis,Ssis,我在csv文件中有2016年12月14日06.23.37.000的日期 如何将ssis中的14-DEC-16 06.23.37.000转换为datetime并插入到sql表中。假设您正在处理的数据中,您知道不会有超出2000-2099范围的日期,并且您知道始终会得到相同的字符串格式,其中包含ENG MOUNT缩写,您可以使用以下转换: DECLARE @DateString nvarchar(50) = N'14-DEC-16 06.23.37.000'; WITH cte AS( SELEC

我在csv文件中有2016年12月14日06.23.37.000的日期


如何将ssis中的14-DEC-16 06.23.37.000转换为datetime并插入到sql表中。

假设您正在处理的数据中,您知道不会有超出2000-2099范围的日期,并且您知道始终会得到相同的字符串格式,其中包含ENG MOUNT缩写,您可以使用以下转换:

DECLARE @DateString nvarchar(50) = N'14-DEC-16 06.23.37.000';

WITH cte AS(
SELECT
  CASE
    WHEN CHARINDEX('-DEC-', @DateString) > 0 THEN REPLACE(@DateString, '-DEC-', '.12.20')
    WHEN CHARINDEX('-NOV-', @DateString) > 0 THEN REPLACE(@DateString, '-NOV-', '.11.20')
    WHEN CHARINDEX('-OCT-', @DateString) > 0 THEN REPLACE(@DateString, '-OCT-', '.10.20')
    WHEN CHARINDEX('-SEP-', @DateString) > 0 THEN REPLACE(@DateString, '-SEP-', '.09.20')
    WHEN CHARINDEX('-AUG-', @DateString) > 0 THEN REPLACE(@DateString, '-AUG-', '.08.20')
    WHEN CHARINDEX('-JUL-', @DateString) > 0 THEN REPLACE(@DateString, '-JUL-', '.07.20')
    WHEN CHARINDEX('-JUN-', @DateString) > 0 THEN REPLACE(@DateString, '-JUN-', '.06.20')
    WHEN CHARINDEX('-MAY-', @DateString) > 0 THEN REPLACE(@DateString, '-MAY-', '.05.20')
    WHEN CHARINDEX('-APR-', @DateString) > 0 THEN REPLACE(@DateString, '-APR-', '.04.20')
    WHEN CHARINDEX('-MAR-', @DateString) > 0 THEN REPLACE(@DateString, '-MAR-', '.03.20')
    WHEN CHARINDEX('-FEB-', @DateString) > 0 THEN REPLACE(@DateString, '-FEB-', '.02.20')
    WHEN CHARINDEX('-JAN-', @DateString) > 0 THEN REPLACE(@DateString, '-JAN-', '.01.20')
  END AS DateString
)
SELECT DateString,
       CONVERT(datetime, RIGHT(LEFT(DateString, 10),4)+'-'+SUBSTRING(LEFT(DateString, 10),4,2)+'-'+LEFT(LEFT(DateString, 10),2) +
                         REPLACE(LEFT(RIGHT(DateString,13),9),'.',':') + RIGHT(DateString, 4)) AS MyDate
  FROM cte

我定义了@DateString,但在这里您也可以使用列别名。

您能告诉我们您尝试了什么吗?使用派生列或脚本转换。这种格式是如此不同寻常,以至于你不可能找到现成的转换,特别是当你谈论1916年的日期时。我建议您确定来源或导出过程使用四位数年份。更好的办法是将其更改为ISO8601格式,使用两位数年份表示您不知道要导入什么。我们已经经历了Y2K带来的麻烦。重新引入这样一个众所周知的错误是不可原谅的。也没有理由假设2016年12月14日是2016年而不是1916年。那是第一次世界大战的第二年。现在有一些纪念活动是关于当时的事件。在接下来的2-3年里,你会发现很多类似的日期。你能在脚本中解释一下这是什么逻辑吗requirment@user7434607只需谷歌就可以了。对于派生列公式和脚本任务的日期时间解析,您将发现大量信息。真正的解决方案是修复损坏的导出格式。关于这两个方面也有很多重复的问题。如何在一个非常快速且肮脏的方法中使用它,可能只是将其作为“执行SQL任务”执行,并将结果提取到一个变量中。另一种可能是创建一个派生列,并在此列上的表达式中使用SSIS特定的字符串处理。