强制DATEPART以固定长度输出的简便方法?

时间:2009-08-18 20:43:56

标签: sql sql-server ssis

当我这样做DATEPART(mm,GETDATE())时,我得到的结果是8月的“8”。如果我在12月做同样的事情,我会得到“12”。这是两个不同长度的结果。

有没有办法让DATEPART结果始终是固定长度?因此,例如,月份将显示为08或12.而日期将是05和30。

更多详情:

我在SSIS中使用派生列转换来获取服务器日期戳,并删除所有格式(空格,冒号,破折号等),以便将其用作主键的一部分。

我目前正在使用的论坛如下,但它会导致长度变化,这并不理想。我希望所有结果都是相同的长度。

((DT_STR,4,1252)DATEPART("yyyy",createDate)) + ((DT_STR,2,1252)DATEPART("mm",createDate)) + ((DT_STR,2,1252)DATEPART("dd",createDate)) + ((DT_STR,2,1252)DATEPART("hh",createDate)) + ((DT_STR,2,1252)DATEPART("mi",createDate)) + ((DT_STR,2,1252)DATEPART("ss",createDate)) + ((DT_STR,2,1252)DATEPART("ms",createDate))

输入看起来像这样:

  

9/11/2008 8:50:47:300 PM

结果如下:

  

20089112050473

结果应该如下:

  

20080911205047300

4 个答案:

答案 0 :(得分:2)

SELECT RIGHT(100+DATEPART(mm, GETDATE()),2)

根据新信息编辑 - 将时间戳记输入固定的数字字符串:

SELECT REPLACE(REPLACE(REPLACE(REPLACE(CONVERT(varchar(23), GETDATE(), 121),'-',''),':',''),' ',''),'.','')

答案 1 :(得分:1)

DATEPART的返回类型为 int 。你要求05的那一刻,不再是int而是一个字符串(char,varchar,nchar,nvarchar等)。只要你理解了它的不同之处就可以了,你可以做各种各样的操作来格式化字符串,这就是DJ表现出来的一个很好的例子。事实上,虽然这种操作的适当位置是在客户端报告上,而不是在服务器上。

答案 2 :(得分:1)

您可以使用CONVERT来获取固定长度的日期,例如:

SELECT CONVERT(nvarchar(30), GETDATE(), 126)

将显示:

 2006-04-18T09:58:04.570

每个变量处于固定位置。

答案 3 :(得分:1)

以Andomar上面的例子为基础:

SELECT REPLACE(REPLACE(REPLACE(REPLACE(
   CONVERT(nvarchar(30), GETDATE(), 126),'-',''),'.',''),':',''),'T','')

将显示:

20060418095804570

警告:使用时间戳作为主键最终咬你的屁股。此外,作为数字的主键将比这样的长字符串更快,因此请考虑更改算法以使用时间戳的数字转换而不是字符串。

解决方案#2 使用包装DateTime.ToString()的.NET用户定义函数,以便您可以传递特定格式(“yyyymmddHHMMss”或其他)。鉴于演员阵容和替换的数量,这可能与直接的T-SQL一样好。