C# 在SSIS中将月份名称转换为月份编号

C# 在SSIS中将月份名称转换为月份编号,c#,sql-server,ssis,etl,derived-column,C#,Sql Server,Ssis,Etl,Derived Column,我有一个输入列“MonthName”,其值采用以下字符串格式2017年5月22日02:29:33.00。我想将其转换为目标表中的Datetime数据类型 为此,需要进行以下转换 2017年5月22日02:29:33.00至2017年5月22日02:29:33.00 如何在派生列任务中实现这一点 我使用下面的表达式来获取值的月份名称部分,但我认为它不符合我的目的 SUBSTRING(MonthName,FINDSTRING(MonthName,"-",1) + 1,FINDSTRING(Month

我有一个输入列“MonthName”,其值采用以下字符串格式
2017年5月22日02:29:33.00
。我想将其转换为目标表中的Datetime数据类型

为此,需要进行以下转换
2017年5月22日02:29:33.00
2017年5月22日02:29:33.00

如何在派生列任务中实现这一点
我使用下面的表达式来获取值的月份名称部分,但我认为它不符合我的目的

SUBSTRING(MonthName,FINDSTRING(MonthName,"-",1) + 1,FINDSTRING(MonthName,"-",2) - FINDSTRING(MonthName,"-",1) - 1) <br/>
SUBSTRING(MonthName,FINDSTRING(MonthName,“-”,1)+1,FINDSTRING(MonthName,“-”,2)-FINDSTRING(MonthName,“-”,1)-1)
上面的表达式创建了一个包含所有月份名称的新列,例如:may、june、july。

您可以使用Sql Server的函数来计算值,无需处理子字符串和FindString;然后只需通过ALTER命令将计算值添加到表定义中。唯一棘手的部分是找到用于格式的格式类型,值表在链接页面上

概念证明:

CREATE TABLE Prototype (
    PrototypeID INT IDENTITY(1,1) NOT NULL
,   Month_Name  VARCHAR(100)      NOT NULL
) ON [PRIMARY]
GO

INSERT Prototype (Month_Name)
VALUES    ('22-MAY-2017 02:29:33.00')
,         ('22-apr-2017 02:29:33.00')
,         ('22-Dec-2017 02:29:33.00')
GO

ALTER TABLE Prototype
ADD  Month_DateTime AS Convert(DateTime, Month_Name, 107)
GO

SELECT * FROM Prototype
=======================
PrototypeID   Month_Name                    Month_DateTime
1             22-MAY-2017 02:29:33.00       2017-05-22 02:29:33.000
2             22-apr-2017 02:29:33.00       2017-04-22 02:29:33.000
3             22-Dec-2017 02:29:33.00       2017-12-22 02:29:33.000
4             22-October-2017 02:29:33.00   2017-10-22 02:29:33.000
使用派生列转换 可以使用以下表达式

LEFT([MonthName],3) + 
(SUBSTRING( [MonthName],4,3) == "JAN" ? "01" :
SUBSTRING( [MonthName],4,3) == "FEB" ? "02" : 
SUBSTRING( [MonthName],4,3) == "MAR" ? "03" :
SUBSTRING( [MonthName],4,3) == "APR" ? "04" :
SUBSTRING( [MonthName],4,3) == "MAY" ? "05" : 
SUBSTRING( [MonthName],4,3) == "JUN" ? "06" :
SUBSTRING( [MonthName],4,3) == "JUL" ? "07" :
SUBSTRING( [MonthName],4,3) == "AUG" ? "08" :
SUBSTRING( [MonthName],4,3) == "SEP" ? "09" : 
SUBSTRING( [MonthName],4,3) == "OCT" ? "10" : 
SUBSTRING( [MonthName],4,3) == "NOV" ? "11" : 
SUBSTRING( [MonthName],4,3) == "DEC"? "12":"") 
+ RIGHT([MonthName],17)
使用脚本组件 如果日期列是字符串,则可以在脚本组件中使用
DateTime.ParseExact
方法。(假设
outDate
是输出列,
inDate
是输入列)

有关此方法的更多信息,请参阅以下链接:

还可以在下面的链接中查看我的答案,这非常有帮助:


这不是转换,只是应用了不同的格式
DateTime.Parse(“22-MAY-2017 02:29:33.00”)
将为您创建一个DateTime对象,您应该能够将其保存在数据库中(假设您尝试在C#中执行此操作,否则请删除该标记)。@Deepthi为什么不接受任何答案,您提出的新问题表明此问题已经解决,并且您正在使用脚本组件。您可以阅读以了解有关接受和投票答案的更多信息
using System;
using System.Globalization;


CultureInfo provider = CultureInfo.InvariantCulture;

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    Row.outDate = DateTime.ParseExact(Row.inDate,"dd-MMM-yyyy HH:mm:ss.ff",provider).ToString("dd-MM-yyyy HH:mm:ss.ff");
}