【问题标题】:Using SSIS and T-SQL to convert date to dd.mm.yyyy使用 SSIS 和 T-SQL 将日期转换为 dd.mm.yyyy
【发布时间】:2019-02-13 14:48:27
【问题描述】:

当我使用 T-SQL 将日期时间转换为使用 SSIS 的 csv 输出的 dd.mm.yyyy 时,该文件是使用 dd-mm-yyyy hh:mm 生成的:ss 这不是我需要的。

我正在使用:

convert(varchar,dbo.[RE-TENANCY].[TNCY-START],104)

在 SSMS 中显示正确。

处理要从 SSIS 输出的转换的最佳方法是什么? 没有我想象的那么简单。

【问题讨论】:

  • 为我们提供重现问题所需的步骤。我不知道您实际上在做什么才能获得您所说的结果。
  • 问题不清楚。那价值从何而来?如果它来自 SQL 查询,为什么不在查询本身中使用该转换呢?在任何情况下,您都希望将日期时间转换 为字符串。这意味着您需要添加转换。你在那里用了什么公式?您是否存储了 original 值,而不是格式化的值?
  • 最后,设置平面文件连接管理器的 locale 可能比尝试即时转换日期和小数更好。
  • 旁白:来自VarChar(n):“当数据定义或变量声明语句中没有指定n时,默认长度为1。当n i> 使用 CAST 和 CONVERT 函数时未指定,默认长度为 30。”最佳做法是始终指定长度。
  • 只要指定长度=1​​0:convert(varchar(10),dbo.[RE-TENANCY].[TNCY-START],104)

标签: sql-server tsql date ssis


【解决方案1】:

它对我有用。

使用您的查询作为驱动程序包的框架

SELECT 
    CONVERT(char(10),CURRENT_TIMESTAMP,104) AS DayMonthYearDate

我为我们的 dd.mm.yyyy 值明确声明了一个长度,因为它总是 10 个字符,所以让我们使用反映这一点的数据类型。

运行查询,可以看到正确生成 13.02.2019

在 SSIS 中,我向数据流中添加了一个 OLE DB 源并粘贴到我的查询中

我连接了一个平面文件目标并运行了包。正如预期的那样,查询生成的字符串进入了数据流,并按预期落到了输出文件中。

如果您遇到其他情况,我首先要检查的是双击您的源和下一个组件之间的线并选择元数据。查看租赁开始列的报告内容。如果它不指示 dt_str/dt_wstr 则 SSIS 认为数据类型是日期变体,并将特定于区域设置的规则应用于格式。您可能还需要检查该列在平面文件连接管理器中的定义方式。

【讨论】:

    【解决方案2】:

    通过T-SQLFORMAT()可以实现对日期输出格式的最精确控制。它自 SQL Server 2012 起可用。 它比 CONVERT() 稍微 slower,但提供了所需的灵活性 一个例子:

    SELECT TOP 4
           name,
           FORMAT(create_date, 'dd.MM.yyyy') AS create_date
    FROM sys.databases;
    
    
    name    create_date
    --------------------
    master  08.04.2003
    tempdb  12.02.2019
    model   08.04.2003
    msdb    30.04.2016
    

    附言考虑到FORMAT() 产生 NVARCHAR 输出,这与您的初始对话逻辑不同,因此可能需要额外转换为 VARCHAR(10)) 来应用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多