【问题标题】:Change Date format from yyyy-mm-dd to mm/dd/yyyy Derived Column将日期格式从 yyyy-mm-dd 更改为 mm/dd/yyyy 派生列
【发布时间】:2013-12-10 23:00:55
【问题描述】:

我有一个 .txt 平面文件源。我将其导入 ssis 以进行一些验证、操作以生成 .csv 文件。

对于某些日期列,我需要将 yyyy-mm-dd 中的日期格式转换为 mm/dd/yyyy。例如:DOB 列有日期 1984-03-16 需要转换为 03/16/1984。我正在使用派生列转换,但无法弄清楚。

如有任何帮助,我们将不胜感激!

【问题讨论】:

  • 原始列的数据类型是什么?如果是日期,则它没有“格式”——这正是 SQL Server 向您呈现它的方式。
  • "...我有一个 .txt 平面文件源..." 没有数据类型。 OP 从一个文本文件开始。

标签: sql-server tsql ssis


【解决方案1】:

不清楚原始列是DATE 还是字符串。下面是一个示例,演示了根据要求为两者转换日期:

DECLARE @t TABLE(d DATE, s CHAR(10));

INSERT @t VALUES('1984-03-16', '1984-03-16');

SELECT d,
  CONVERT(CHAR(10), d, 101),
  CONVERT(DATE, s),
  CONVERT(CHAR(10), CONVERT(DATE, s), 101)
FROM @t;

结果:

1984-03-16          03/16/1984            1984-03-16          03/16/1984
^^^^^^^^^^ date     ^^^^^^^^^^ string     ^^^^^^^^^^ date     ^^^^^^^^^^ string

如果你将它存储为一个字符串,你真的不应该这样做。当您为您认为需要的数据类型(例如格式)选择错误的数据类型时,您会丢失各种重要的数据。验证是最重要的一项 - 如果您将 CHAR(10) 用于 YYYY-MM-DD 日期,是什么阻止某人输入 9999-99-99yeah-no-go

无论如何,这是一个格式化作业,在消耗这些数据的另一端处理得更好。在将其打印在纸上或显示在报告上之前,绝对没有理由获取日期或日期时间值并强制它像字符串一样工作。即使在演示方面,我也质疑像mm/dd/yyyy 这样的区域性、模棱两可的格式是否明智。你确定你现在和未来的所有观众都明白09/06/2013 是 9 月 6 日而不是 6 月 9 日吗?有英国或加拿大的朋友想通过它来经营吗?

【讨论】:

  • 我认为在 SSIS 中然后从平面文件插入你不能使用 SQL 语法......所以@Muhammed Ali 的答案可能更好......
  • @Justin 那么我真的很想知道你为什么要首先以这种模棱两可的字符串格式将它带入 SQL Server。如果它进入日期或日期时间列,则格式不可靠;如果它进入一个字符串列,那么这完全是错误的数据类型。在这两种情况下,原始格式都更好(尽管yyyymmdd 是最好的)。
  • @Aaron Bertrand:感谢您的回答和很好的解释。你的方法是对的。但是我没有将数据加载到 sql server 中,否则我会保持它与您建议的格式相同。我的包只会生成一些数据导入工具将使用的 .csv 文件。由于 ssis 不像 Justin 提到的那样使用 sql 语法,我不得不采用 Muhammed 的方法。我不是在批评你,因为你的方法在其他情况下也是正确的,并为没有提供足够的信息而道歉。(例如,日期是字符串)。
【解决方案2】:

假设您的日期列称为 DateCol

您需要从该列创建三个派生列,而不是像这样简单地将它们连接起来

derivedColumns   Expression 
year             SUBSTRING(DateCol, 1, 4)
day              RIGHT(DateCol, 2)
Month            SUBSTRING(DateCol, 6, 2)

NewDate          SUBSTRING(DateCol, 6, 2) + "/" + RIGHT(DateCol, 2)+ "/"+SUBSTRING(DateCol, 1, 4)

您的 NewDate 列将采用您想要的格式

【讨论】:

  • @AaronBertrand 第一三栏仅用于演示目的,向 OP 展示他如何提取日、月和年部分。
  • 即使没有其他三列,恕我直言,将其分成三个字符串也是一项繁重的工作。
  • @AaronBertrand opss 非常简单的解决方案刚刚看到你的答案:)
  • @AaronBertrand 大声笑不,我会坚持我的(直到你离开):)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-29
  • 2021-08-05
相关资源
最近更新 更多