5

最近我偶然发现了CONVERT函数样式 23,它非常方便,因为它以格式为您提供 DATE yyyy-mm-dd。问题是它没有记录在 msdn 中!(来自 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)

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

4

3 回答 3

12

主要基于这篇文章,文档中还缺少很多其他内容(自 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; 

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

于 2013-03-21T18:30:06.510 回答
4

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

SELECT CONVERT(CHAR(10),GETDATE(),120)
于 2013-03-21T20:20:08.483 回答
1

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

我也同意 Aaron 的观点,即未记录的东西可能意味着他们不希望人们知道或使用它,因此在某些时候任意删除/缺陷对我们来说并不奇怪。

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

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

  • 100以下的所有款式1
  • 106
  • 107,
  • 109,
  • 113,
  • 130.

1样式 20 和 21 除外

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

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

(2) 已经有问题的链接。
(3) 2017 年 8 月 27 日。

于 2017-08-27T08:59:50.553 回答