未记录的CONVERT样式 - 日期时间23

时间:2013-03-21 18:25:34

标签: sql-server tsql datetime sql-server-2008-r2 string-formatting

最近我偶然发现CONVERT函数样式23,这非常方便,因为它以格式yyyy-mm-dd为您提供DATE。问题是它没有在msdn中记录! (在CONVERT上的F1之后从SSMS帮助链接:http://msdn.microsoft.com/en-us/library/ms187928%28SQL.105%29.aspx)。 例如:

select convert( date ,'2012-01-30', 23)
select convert(varchar(255), getdate(), 23)

这种风格非常有用,我一直都很想念它,但我担心的是:   - 使用安全吗?它是否被弃用或潜入错误,可能会在将来的版本/更新中删除?   - 有人知道其他隐藏的风格吗?

3 个答案:

答案 0 :(得分:11)

主要基于this article,文档中还有很多其他文档丢失(自2005年以来可能引入了更多文档,自我尝试探索以来已经有一段时间了):

--DROP TABLE dbo.DateTimeStyles;
CREATE TABLE dbo.DateTimeStyles
(  
    styleID TINYINT PRIMARY KEY,  
    outputLength TINYINT, 
    outputSyntax AS (CONVERT(VARCHAR(255), 'CONVERT(CHAR(' 
        + RTRIM(outputLength) + '), CURRENT_TIMESTAMP, ' 
        + RTRIM(styleID) + ')')), 
    outputSample VARCHAR(255)
); 

INSERT dbo.DateTimeStyles(styleID, outputLength) 
VALUES (0,   19 ), (1,   8  ), (2,   8  ), (3,   8  ),
       (4,   8  ), (5,   8  ), (6,   9  ), (7,   10 ),
       (8,   8  ), (9,   26 ), (10,  8  ), (11,  8  ),
       (12,  6  ), (13,  24 ), (14,  12 ), (20,  19 ), 
       (21,  23 ), (22,  20 ), (23,  10 ), (24,  8  ),
       (25,  23 ), (100, 19 ), (101, 10 ), (102, 10 ),  
       (103, 10 ), (104, 10 ), (105, 10 ), (106, 11 ),  
       (107, 12 ), (108, 8  ), (109, 26 ), (110, 10 ),  
       (111, 10 ), (112, 8  ), (113, 24 ), (114, 12 ),  
       (120, 19 ), (121, 23 ), (126, 23 ), (127, 23 ),
       (130, 32 ), (131, 25 );

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'UPDATE dbo.DateTimeStyles 
        SET outputSample = ' + outputSyntax + ' 
        WHERE styleID = ' + RTRIM(StyleID) + ';'
    FROM dbo.DateTimeStyles; 

EXEC sp_executesql @sql;

SELECT styleID, outputSyntax, outputSample
  FROM dbo.DateTimeStyles
  ORDER BY styleID; 

当然,与许多未记载的内容一样,使用“秘密”内容需要您自担风险。你应该在你使用它们的地方标记模块,这样你就可以在升级之前对它们进行测试 - 它们不会是升级顾问,最佳实践分析器,弃用跟踪事件,扩展事件等等,它们会提取并告诉你,因为微软可以自由决定删除任何未记录的功能/语法(尽管我发现它们不太可能删除任何这些,即使他们对记录它们不感兴趣)。如果您有一个部署Service Pack /升级的测试服务器,那么在任何此类升级之后运行此代码将告诉您此处使用的任何样式是否已被删除。因此,您可能希望将此代码保存在某处,并且只包含您主动使用的未记录的样式编号。

答案 1 :(得分:4)

至于风格23的具体情况......我建议不使用它,因为有这么简单的文件替代方案:

SELECT CONVERT(CHAR(10),GETDATE(),120)

答案 2 :(得分:1)

对于“CAST和CONVERT”文章的旧 2 和更新的 3 版本,包括99及以下的几种样式是不确定的。有些人至少可以说,会认为不安全。

我也同意Aaron认为某些事情未被记录可能意味着他们不希望人们意识到它或使用它,因此在某些时候任意删除/缺陷不应该是一个惊喜我们。

关于转换非确定性,引用newer article version,在“某些日期时间转换是不确定的”下:

  

以下 [list]列出了字符串到日期时间转换不确定的样式。

     
      
  • 所有款式低于100 1
  •   
  • 106
  •   
  • 107
  •   
  • 109
  •   
  • 113
  •   
  • 130
  •   
     

1 除了样式20和21

同样来自同一篇文章的“日期和时间样式”下,这个不太明显的引用似乎重复了相同的列表,增加了100:

  

1 这些样式值返回非确定性结果。包括所有(yy)(没有世纪)样式和(yyyy)(有世纪)样式的子集。

(2)已经有问题链接。
(3)2017-Aug-27。