T-SQL SSIS 将日期时间类型导出为日期时间

T-SQL SSIS Export DateTime type to Date Time

我在 Sql Server in DateTime 类型列中有一些列,需要使用 SSIS 将它们导出为时间格式和日期格式的 csv。我可以使用 format 和 cast 使它们在查询中显示为时间和日期,如开始时间、结束时间、开始日期、结束日期列中结果的右侧部分所列。

  ,BEGIN_TIM [Start DTTime]  --datetime
  ,END_TIM [End DTTime]  --datetime
  ,BEGIN_DTE [Start DTDate] --datetime
  ,END_DTE [End DTDate]  --datetime
  
  ,FORMAT(BEGIN_TIM, 'hh:mm tt' ) [Start Time]
  ,FORMAT(END_TIM, 'hh:mm tt' ) [End Time]

  ,cast(BEGIN_DTE as date) [Start Date] 
  ,cast(END_DTE as date) [End Date] 

结果

-- Start DTTime             End DTTime              Start DTDate            End DTDate              Start Time  End Time    Start Date  End Date
--1900-01-01 08:30:00.000   1900-01-01 12:30:00.000 2022-05-10 00:00:00.000 2022-06-28 00:00:00.000 08:30 AM    12:30 PM    2022-05-10  2022-06-28
--1900-01-01 08:30:00.000   1900-01-01 12:30:00.000 2022-07-07 00:00:00.000 2022-08-09 00:00:00.000 08:30 AM    12:30 PM    2022-07-07  2022-08-09
--1900-01-01 08:30:00.000   1900-01-01 12:30:00.000 2022-08-03 00:00:00.000 2022-08-12 00:00:00.000 08:30 AM    12:30 PM    2022-08-03  2022-08-12
--1900-01-01 00:00:00.000   1900-01-01 12:00:00.000 2022-08-02 00:00:00.000 2022-08-12 00:00:00.000 12:00 AM    12:00 PM    2022-08-02  2022-08-12

我将这些列插入 table,然后在 SSIS 中将 OLE DB 源连接到视图。当我使用平面文件连接管理器导出列时,它们以日期时间格式出现。

平面文件连接管理器导出日期时间格式

"Start time"         ,"End Time"           ,"Start Date"         ,"End Date"           
"1900-01-01 08:30:00","1900-01-01 12:30:00","2022-05-10 00:00:00","2022-06-28 00:00:00"

如果我将高级平面文件连接管理器中的数据类型设置为 DT_DBTME DT_DBDATE,当我关闭并再次查看数据类型时它不会保存。

看来我可能需要在 Sql 服务器中使用时间数据类型和日期数据类型,或者想方设法将导出格式设置为 SSIS 中的时间和日期。这可能意味着使用派生列。

将时间列和日期列中的日期时间类型列导出到 csv 文件的最佳方法是什么?

一个解决方案- 如果我格式化用于 Ole DB 源的视图中的列,SSIS 将数据类型设置为 Unicode 字符串 DT_WSTR 并且列以正确的格式导出。

        FORMAT([Start Time], 'hh:mm tt' ) [Start Time], FORMAT([End Time], 'hh:mm tt' ) [End Time], 
        FORMAT([Start Date], 'dd-MM-yyyy' ) [Start Date], FORMAT([End Date], 'dd-MM-yyyy' ) [End Date], 

"Start time","End Time","Start Date","End Date" 
"08:30 AM"  ,"12:30 PM","10-05-2022","28-06-2022"

您似乎需要以特定格式导出日期和时间。当您在 select 语句中强制它们正确表示时,管道接收的元数据是数据类型为字符串 DT_STR/DT_WSTR.

至关重要。

如果这些列第一次呈现给管道时它们是日期或时间类型,则 SSIS 可能保留了元数据并隐式转换回日期时间类型。双击源和目标之间的管道将显示类型。

平面文件格式连接管理器也是如此。在这里,您希望将日期和时间列指定为字符串,因为虽然它包含日期和时间数据,但您有一个特定的格式,因此请将其保留为正确长度的字符串(和 unicode-ness)。