无证CONVERT样式 - 23日期时间(undocumented CONVERT styles

2019-07-22 10:17发布

最近,我偶然发现了CONVERT函数式的23,这是非常方便,因为它让你在日期格式yyyy-mm-dd 。 问题是,它不是在MSDN文档! (上CONVERT链接从SSMS帮助F1后: 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)

这种风格是非常有用的,我已经错过了,但我的担心是: - 是否可以安全使用? 难道过时或错误地潜入,并可能在以后的版本/更新被删除? - 是否有人知道的其他隐藏的风格?

Answer 1:

主要基于这篇文章 ,有很多人从失踪文档的(也许更已自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; 

当然,与许多无证的东西,用“秘密”的人,在你自己的风险。 你应该标注在您使用它们的模块,这样就可以以升级前测试他们 - 他们不会被事物的升级顾问,最佳实践分析器,折旧跟踪事件,扩展事件等会拿起并告诉你,因为微软是免费在他们自己的自由裁量权,以消除任何未记录的功能/语法(虽然我觉得不大可能,他们永远不会删除任何这些,即使他们不感兴趣的记录它们)。 如果你有,你部署的服务包/升级,运行此代码后有任何这样的升级会告诉你,如果任何这里使用的样式已被删除的测试服务器。 所以,你可能想的地方,并只保存该代码包括您积极地使用无证风格的数字。



Answer 2:

至于风格23的特定情况下...我建议不要因为有这样一个简单的文件替代使用它:

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


Answer 3:

每两个老2和更新3个版本“CAST和CONVERT”的文章, 几个款式,包括99及以下的不确定性。 有些人,至少可以说,就认为是不安全的。

我也同意亚伦的东西被无证可能意味着他们不希望人们意识到这一点,或者使用它,因此任意拆卸/缺陷在某些时候不应该是一个惊喜给我们。

关于转换确定性,理由是新的文章版本 ,“ 某些日期时间转换是不确定的 ”下:

[表]列出了该字符串到日期时间转换是不确定的样式。

  • 低于100 1所有样式
  • 106
  • 107,
  • 109,
  • 113,
  • 130。

1随着样式20和21之外

另外,从同一篇文章,在“ 日期和时间样式 ”,这可见少报价似乎重复相同的列表,增加的100:

1这些样式值返回不确定的结果。 包括所有(YY)(不含世纪)款式和(年)的一个子集(含世纪)样式。

(2)在问题已链接。
(3)2017 - 8 - 27。



文章来源: undocumented CONVERT styles - datetime 23