Sql server 将日期格式从yyyy-mm-dd更改为mm/dd/yyyy派生列

Sql server 将日期格式从yyyy-mm-dd更改为mm/dd/yyyy派生列,sql-server,tsql,ssis,Sql Server,Tsql,Ssis,我有一个.txt平面文件源代码。我将其导入ssis以进行一些验证和操作,从而生成一个.csv文件 我需要将某个日期列的日期格式从yyyy-mm-dd转换为mm/dd/yyyy。例如:DOB列的日期为1984-03-16,需要转换为1984年3月16日。我正在使用派生列转换,但无法理解它 感谢您的帮助 假设您的日期列名为DateCol 您将需要从该列创建三个派生列,而不是像这样简单地将它们连接起来 derivedColumns Expression year SUBS

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

我需要将某个日期列的日期格式从yyyy-mm-dd转换为mm/dd/yyyy。例如:DOB列的日期为1984-03-16,需要转换为1984年3月16日。我正在使用派生列转换,但无法理解它


感谢您的帮助

假设您的日期列名为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列将采用所需格式

不清楚原始列是日期还是字符串。下面是一个示例,演示了根据请求为以下两种情况转换日期:

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
如果将其存储为字符串,则不应该这样做。当您为您认为需要的内容(如格式)选择错误的数据类型时,您会丢失所有重要的内容。验证是最大的一个-如果您对
YYYY-MM-DD
日期使用
CHAR(10)
,是什么阻止某人输入
9999-99-99
yeah no go


在任何情况下,这都是一个格式化作业,在使用此数据的任何对象的另一端都可以更好地处理。在打印在纸上或显示在报表上之前,绝对没有理由获取日期或日期时间值并强制其像字符串一样工作。即使在演示方面,我也质疑是否应该演示一种区域性的、模棱两可的格式,如
mm/dd/yyyy
。你确定你现在和未来的所有观众都知道2013年6月9日是9月6日而不是6月9日吗?您在英国或加拿大有没有朋友想要运行此功能?

原始列的数据类型是什么?如果是date,它就没有“格式”-这正是SQL Server向您展示它的方式。“…我有一个.txt平面文件源…”数据类型不在其中。OP以文本文件开始。@AaronBertrand前三列仅用于演示OP如何提取日、月和年部分。即使没有其他三列,将其拆分为三个字符串是一项非常繁忙的工作。@AaronBertrand opss非常简单的解决方案刚刚看到了您的答案:)@AaronBertrand lol no我会坚持我的(直到您离开):)我认为在SSIS中,然后从平面文件插入,您不能使用SQL语法。。。所以@Muhammed Ali answer可能更好…@Justin那么我真的想问一下,为什么您首先要将它以这种模棱两可的字符串格式引入SQL Server。如果进入日期或日期时间列,则格式不可靠;如果它进入一个字符串列,那么这就是错误的数据类型。在这两种情况下,原始格式都更好(尽管
yyyymmdd
是最好的)。@Aaron Bertrand:谢谢你的回答和很好的解释。你的方法是正确的。但我不会将数据加载到sql server中,否则我会将其保持与您建议的格式相同。我的软件包将只生成.csv文件,该文件将由某些数据导入工具使用。由于ssis没有像Justin提到的那样使用sql语法,所以我不得不采用Muhammed的方法。我不是批评你,因为你的方法在其他情况下也是正确的,并为没有提供足够的信息而道歉。(例如,日期是字符串)。