【问题标题】:Convert Wed Oct 14 08:00:00 CDT 2020 format to DateOnly and Time Only将 Wed Oct 14 08:00:00 CDT 2020 格式转换为 DateOnly 和 Time Only
【发布时间】:2020-10-16 18:09:07
【问题描述】:

我们收到一个 csv 文件,其中有一列采用这种日期格式 -- Wed Oct 14 08:00:00 CDT 2020,以及一个包含每个日期/时间计数的列

我正在使用 SSIS 包来抓取文件并将这些数据导入到 sql 表中,然后我可以按照我需要的方式对其进行格式化,然后以所需的格式实际导出数据。

如果有一种方法可以在一个 SSIS 包中完成这一切,我会全力以赴,但目前我正在努力将数据转换为 SQL 并转换为正确的格式,以便我可以将其导出。

我需要获取该文件并转换该日期格式并将其分成两个单独的列

一列将是这种格式的日期 2020-10-14 00:00:00.000

一列将是这种格式的时间 08:00:00.0000000

已更新以更改日期以匹配,因此它不会那么混乱,而且我在运行下面建议的代码时收到的错误。

Image of Error I'm recieving

Image of table with the data I am trying to convert

Image of table attributes

Screenshot of my screen when running a select * from the table I am pulling the data that I need converted

Screenshot of the error I receive when running the query by Aaron.

【问题讨论】:

  • 您必须编写代码来解析这个自定义且坦率地说相当不寻常的字符串。什么是 CDT?古巴夏令时间?时区abbreviations 不明确且未标准化。也至少有 3 个 IST 和 BST
  • 如果您编写了 C# 脚本转换,您可以解析每个元素除了时区缩写
  • 您没有正确实现我的查询,仅此而已。您需要将原始 TRY_CONVERT 应用到表中,然后从中提取日期和时间。在您的实现中,您将TRY_CONVERT 应用于变量,但随后仍尝试从原始表中未更改的值中提取日期和时间。那是我的错 - 我没有在解决方案中包含表格,因为您最初没有提供表格/列名。请查看我的更新答案。
  • 成功了!你是上帝派来的!!!!非常感谢你! @AaronBertrand
  • @AaronBertrand 我不想再打扰你了....但是我怎样才能让“封面”列使用新的格式化字段?

标签: sql-server ssis date-conversion


【解决方案1】:

如果这是它始终采用的格式,并且时区无关紧要,您可以先尝试将其转换为datetime,然后您可以从中提取部分。

SET LANGUAGE us_english; -- important because not all languages understand "Oct"

;WITH src AS 
(
  SELECT dt = TRY_CONVERT(datetime, RIGHT(OpenedDateTime ,4) 
              + SUBSTRING(OpenedDatetime, 4, 16))
         --, other columns...    
    FROM [dbo].[VIRTUALROSTERIMPORT_Res_Import]
)
SELECT OpenedDateTime = CONVERT(datetime, CONVERT(date, dt)), 
       OnHour = CONVERT(time, dt)
       --, other columns... 
FROM src;

结果:

OpenedDateTime   OnHour
--------------   ----------------
2020-10-14       08:00:00.0000000

如果您需要从一个时区切换到另一个时区,那就是另一回事了。

【讨论】:

  • @PanagiotisKanavos 这就是为什么我要求澄清时区是否相关。
  • 您认为 OP 想要当地时间?有两个 CDT 相差 1 小时
  • @PanagiotisKanavos 我已经要求澄清。并陈述了我的假设。日期也不正确(你如何从 10 月 14 日获得 1 月 22 日),所以是的,我假设时区在源中但不相关(OP 从未说明目标时区,你只是假设这是一个不同的时区,因为他们从 8:00 到 6:00?)。
【解决方案2】:

我只是展示日期格式,不要看我使用的实际日期示例。时区无关紧要,我只需要更改格式。 当我使用 Aaron 建议的代码时,我遇到了转换错误:我假设它是因为表中的列是 varchar,但我无法将日期加载为日期格式,因为 SSIS 不断给我截断错误 - 所以我有将其加载为 varchar。

下面是我正在运行的代码,我对其进行了调整以使用我正在使用的列名和表名。

SET LANGUAGE us_english; -- important because not all languages understand "Oct"

DECLARE @foo varchar(36) = 'Wed Oct 14 08:00:00 CDT 2020';

;WITH src(d) AS 
(
  SELECT TRY_CONVERT(datetime, RIGHT(@foo,4) + SUBSTRING(@foo, 4, 16))
)
SELECT OpenedDateTime = CONVERT(datetime, CONVERT(date, OpenedDateTime)), 
       onhour = CONVERT(time, OpenedDateTime) 
FROM [dbo].[VIRTUALROSTERIMPORT_Res_Import];

【讨论】:

  • 这是采用这种格式的列:Wed Oct 14 08:00:00 CDT 2020
  • 但该值有效。显示另一个不起作用的值。
  • @AaronBertrand 我刚刚编辑了我的条目,添加了两个可能有用的屏幕截图!
  • 我认为屏幕截图中的任何值都不是导致此失败的值。试试SELECT TOP (1) OpenedDateTime FROM dbo.VIRTUALROSTERIMPORT_Res_Import WHERE ISDATE(RIGHT(OpenedDateTime,4) + SUBSTRING(OpenedDateTime, 4, 16)) = 0
  • 返回空白,没有结果! @AaronBertrand
猜你喜欢
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
相关资源
最近更新 更多