SSIS将日期时间变量更改为其他格式
Posted
技术标签:
【中文标题】SSIS将日期时间变量更改为其他格式【英文标题】:SSIS change datetime variable to other format 【发布时间】:2012-10-24 11:11:10 【问题描述】:我的 SSIS 包中有一个 ADO.NET 源,我正在尝试进行以下查询:
"SELECT * FROM Table WHERE DateAdded > '@[User::InputDateV]'"
另一方面,我有一个名为 InputDateV 的 DateTime 变量。
我的问题是在变量值中我可以使用以下日期:24/10/2012 但我的 Sql 服务器这个日期无效,应该是 10/24/2012。
如何将变量的日期时间格式更改为 (mm/dd/yyyy)?
谢谢。
问候。
何塞。
【问题讨论】:
你可能会觉得this question很有趣 【参考方案1】:最安全的选择是将您的 DateTime 变量转换为 ISO 日期格式:
"'" + (DT_WSTR,4)YEAR(@[User::InputDateV])
+ RIGHT("0" + (DT_WSTR,2)MONTH(@[User::InputDateV]),2)
+ RIGHT("0" + (DT_WSTR,2)DAY(@[User::InputDateV]),2)
+ "'"
计算结果为“20121024”,因此是 SQL Server 的完美、明确的日期字符串。
【讨论】:
YYYY-MM-DD 不是明确的:尝试 2012-13-11 使用法语,看看会发生什么。根据the documentation,明确的ISO8601 格式是YYYYMMDD
(时间是可选的)或YYYY-MM-DDThh:mm:ss[.mmm]
(只有毫秒是可选的)。所以你应该从你的例子中删除破折号。
我们总是使用'YYYYMMDD',不知道为什么我把它弄得比需要的更复杂。最后,我们都学到了一些东西。谢谢!代码已更改。
我确认上述方法有效,因为我现在在 SSIS 包中使用它。基本上,您将 DateTime 变量分解为它的元素,然后按照 milivojevi 的解释将其重建为 YYYYMMDD。但很奇怪 - 如果您使用 DT_WSTR 强制转换将 GETDATE() 转换为字符串,则会出现 YYYY-MM-DD hh:mm:ss,但如果您使用 DT_WSTR 转换 SSIS DateTime 变量,则会出现 DD/MM /YYYY。这几乎就像 GETDATE() 的结果是使用与 SSIS DateTime 不同的类型存储的。无论如何,上述答案有效。【参考方案2】:
日期时间数据类型没有格式。当您将其转换为字符串类型时,是的,您可以应用区域设置感知格式,但在内部,日期时间与区域设置无关。
我将以 ADO.NET 源代码作为我的回应的序言,它比 OLE 源代码要痛苦得多。
在我的复制过程中,我有一个执行 SQL 任务,它创建一个表并在其中粘贴一些数据。然后它会路由到数据流任务。
在我的数据流中,我从SELECT T.* FROM dbo.[Table] AS T
的查询开始。目前没有 WHERE 子句。这是为了允许数据流组件注册源查询的元数据。
要对其进行参数化,您需要返回到控制流级别。选择数据流任务并在属性下,您需要为 ADO NET 源的 SqlCommand 属性添加一个表达式。
根据我的经验,在变量上构建表达式并将变量分配到任务的属性中比在任务本身中创建它更好。如果没有其他原因,这种方法允许您设置断点并查看本地变量并直观地检查值。这不能在对象的表达式上完成 - 特别是如果所述表达式导致包失败。
为此,您将看到我在我的 SSIS 包中定义了两个变量。
InputDateV - 数据类型为 DateTime,其值为10/24/2012 12:01 AM
我添加了一个时间组件只是为了显示它,但您可以根据需要将其去掉。
查询 - 数据类型为字符串。这个变量的属性是 EvaluateAsExpression = True 并且表达式是 "SELECT T.* FROM dbo.[Table] T WHERE T.DateAdded > '" + (DT_WSTR, 24)@[User::InputDateV] + "'"
在这里我将与区域设置无关的日期时间值强制转换为可识别区域设置的类型,但因为它是通过 .NET 代码的魔力,所以它会起作用。
然后我使用@[User::Query] 配置[ADO NET Source].[SqlCommand],神奇的是,一切正常。
万一我误解了你上面关于变量名的定义。如果@[User::InputDateV] 实际上是一种字符串,那么上面的方法对你不起作用。我创建了一个数据类型为字符串的变量@[User::InputDateS],并为其分配了一个值24/10/2012
。如果我修改 @[User::Query] 表达式以使用它,SQL Server 将拒绝它,因为它无法将该值转换为日期时间数据类型。所以让 SSIS 表达式执行翻译。将@[User::Query] 上的表达式修改为
"SELECT T.* FROM dbo.[Table] T WHERE T.DateAdded > '" + (DT_WSTR, 24)((DT_DATE) @[User::InputDateS]) + "'"
和 Bob 是你的叔叔,包装上的绿色方框。
参考
How do I use parameters in an SSIS ADO NET source?【讨论】:
【参考方案3】:您可以使用 SSIS 字符串变量并将值保存为“mm/dd/yyyy”格式。传递给准备查询的值有单引号('),这样就可以了。如果要使用 SSIS 日期时间进行维护,请使用 System.DateTime 使用脚本组件准备查询,如下所示。那么您的查询将准备就绪。希望这会有所帮助。
public void Main()
// Map your variable using Dts.Variables["NameOfDateTimeVariable"].Value
DateTime dt= DateTime.Now;
var dateTime = string.Format("0:mm/dd/yyyy",dt);
var query = string.Format("SELECT * FROM Table WHERE DateAdded > '0'",dateTime);
//Map the query to your variable if you want
Dts.TaskResult = (int)ScriptResults.Success;
谢谢, 高达曼
【讨论】:
嗨 Godhaman,感谢您的回复可能是一个愚蠢的问题,但我看不到我的 ADO.Net 源代码背后的代码。我只能看到用于数据流的 Visual Studio 编辑器。我怎么能看到源代码?以上是关于SSIS将日期时间变量更改为其他格式的主要内容,如果未能解决你的问题,请参考以下文章