以有效的MMDDYYYY格式输出日期

时间:2014-12-12 15:41:02

标签: sql sql-server tsql sql-server-2012

我有以下脚本,结果为YYYYMMDD。但是,我需要MMDDYYYY格式的结果。

有人可以帮忙吗?我希望数字之间没有短划线/笔画/句号。

SELECT CONVERT(VARCHAR(10), RowUpdateDateTime, 112)
from MyTable

结果:20141113

我希望它看起来像11132014

我尝试了FORMAT语法,但它一直在运行。

2 个答案:

答案 0 :(得分:3)

看看CONVERT() documentation:没有一种格式与您正在寻找的完全匹配。看起来110是最接近的。我们可以通过添加REPLACE()调用来完成:

SELECT REPLACE(CONVERT(VARCHAR(10), RowUpdateDateTime, 110),'-','') from MyTable

我也想知道你为什么这么做。很多时候,您的客户端代码可以更有效地处理这样的转换。

答案 1 :(得分:1)

这在SQL Server 2012中很简单。

FORMAT函数接受标准的.NET格式化模式,因此您可以直接指定所需的格式,而不是操纵大致正确的结果。

SELECT FORMAT(RowUpdateDateTime,'MMddyyyy','en-us')

但是我刚刚注意到您的评论已经尝试了这一点,并遇到了性能问题。

这是我迄今为止尝试过的最快的一次。

SELECT CONCAT(CASE
                WHEN MONTH(D) < 10
                  THEN '0'
              END, MONTH(D), CASE
                               WHEN DAY(D) < 10
                                 THEN '0'
                             END, DAY(D), YEAR(D)) 

对10,000,000个日期进行测试需要12秒,而REPLACE(CONVERT(VARCHAR(10), RowUpdateDateTime, 110),'-','')为21秒,FORMAT版为180秒。

测试脚本(取消注释被测试的脚本)

    WITH 
    E1(N) AS 
    (
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
    )                                       -- 1*10^1 or 10 rows
    , E2(N) AS (SELECT 1 FROM E1 a, E1 b)   -- 1*10^2 or 100 rows
    , E4(N) AS (SELECT 1 FROM E2 a, E2 b)   -- 1*10^4 or 10,000 rows
    , E8(N) AS (SELECT 1 FROM E4 a, E4 b)   -- 1*10^8 or 100,000,000 rows
    , Dates(D) AS
    (
    SELECT TOP (10000000) DATEADD(MILLISECOND, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),0) AS N FROM E8   
    )
    SELECT 
    --12 Seconds
    MAX(CONCAT(CASE WHEN MONTH(D) < 10 THEN '0' END, MONTH(D), CASE WHEN DAY(D) < 10 THEN '0' END, DAY(D), YEAR(D)))
    --21 Seconds
    --MAX(REPLACE(CONVERT(VARCHAR(10), D, 110),'-',''))
    --180 Seconds
    --MAX(FORMAT(D,'MMddyyyy', 'en-us')) --18
    FROM Dates