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

Posted

技术标签:

【中文标题】强制 DATEPART 以固定长度输出的简单方法?【英文标题】:Easy way to force DATEPART to output as fixed-length? 【发布时间】:2009-08-18 20:43:55 【问题描述】:

当我做例如 DATEPART(mm, GETDATE()) 时,我得到的月份结果是八月份的“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))

输入看起来像这样:

2008 年 9 月 11 日晚上 8:50:47:300

结果如下:

20089112050473

结果应如下所示:

20080911205047300

【问题讨论】:

【参考方案1】:
SELECT RIGHT(100+DATEPART(mm, GETDATE()),2)

根据新信息进行编辑 - 将您的时间戳设置为固定的数字字符串:

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

【讨论】:

这行得通。我的最终论坛如下: ((DT_STR,4,1252)DATEPART("yyyy",createDate)) + RIGHT(((DT_STR,2,1252)100 + (DT_STR,2,1252)DATEPART("mm", createDate)),2) + RIGHT(((DT_STR,2,1252)100 + (DT_STR,2,1252)DATEPART("dd",createDate)),2) + RIGHT(((DT_STR,2,1252)100 + (DT_STR,2,1252)DATEPART("hh",createDate)),2) + RIGHT(((DT_STR,2,1252)100 + (DT_STR,2,1252)DATEPART("mi",createDate)), 2) + RIGHT(((DT_STR,2,1252)100 + (DT_STR,2,1252)DATEPART("ss",createDate)),2) + RIGHT(((DT_STR,2,1252)1000 + (DT_STR, 2,1252)DATEPART("ms",createDate)),3)【参考方案2】:

DATEPART 的返回类型是 int。你要求05 的那一刻,不再是int,而是一个字符串(char、varchar、nchar、nvarchar 等)。只要您了解其中的区别并且对它没问题,您就可以按照自己的意愿进行各种操作来格式化字符串,一个很好的例子就是 DJ 展示的。事实上,虽然此类操作的适当位置是在客户端报告上,而不是在服务器上。

【讨论】:

【参考方案3】:

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

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

将显示:

 2006-04-18T09:58:04.570

其中每一个变量都在一个固定的位置。

【讨论】:

【参考方案4】:

以上面 Andomar 的示例为基础:

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

将会显示:

20060418095804570

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

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

【讨论】:

以上是关于强制 DATEPART 以固定长度输出的简单方法?的主要内容,如果未能解决你的问题,请参考以下文章

js生成随机固定长度字符串的简便方法

强制 pad_sequence 到一定长度

在C语言中如何固定字符的长度

三分钟读懂摘要算法

去除最少边以强制增加未加权无向图中最短路径长度的算法

hashlib模块