0

我有几列具有日期或日期时间数据的 varchar(max) 类型。我想将它们转换为日期类型,我知道我应该使用 CONVERT 函数。到这里都没问题!

我手头的问题是每列中存储的日期不是来自相似的日期格式类型;不跨列,甚至不在一列内。换句话说,日期格式在列内不一致。一列中的某些日期可能如下所示:


DDMMMYYYY

日/月/年

月/日/年

……


使用 convert (不指定日期样式)最终会产生疯狂的输出。

我需要一个将这些 varchar 转换为日期并保留原始格式的脚本。

我知道 SET DATEFORMAT 功能;是否有 GET DATEFORMAT 的反向功能?有没有办法检测日期格式样式?

4

2 回答 2

0

SQL Server 日期数据类型没有“格式”。日期是一个 4 字节的二进制结构,其显示格式完全由呈现数据的客户端应用程序控制。

将未分隔的 DDMMYYYY 值可靠地解析为日期是可能的,因为字符串上的日期组件是已知的。但是,在日分量小于 13 的情况下,DD/MM/YYYY 和 MM/DD/YYYY 是不明确的。

于 2017-06-26T16:40:27.873 回答
0

TRY_CONVERT()如果您使用的是 SQL Server 2012 或更高版本,则可以使用该功能。您可以使用CONVERT文档中定义的样式。

例如,这将转换表中具有 MM/DD/YYYY 格式 (101) 的日期的每个值,该值可能是 DD/MM/YYYY 格式 (105):

SELECT TRY_CONVERT(date, VarcharColumn, 101)
FROM UnnamedTable
WHERE TRY_CONVERT(date, VarcharColumn, 101) IS NOT NULL
    AND TRY_CONVERT(date, REPLACE(VarcharColumn,'/','-'), 105) IS NULL

这将转换 DDMMMYYYY 格式的每个值(最接近 106):

SELECT TRY_CONVERT(date, SUBSTRING(VarcharColumn,1,2) + ' ' + SUBSTRING(VarcharColumn,3,3) + ' ' + SUBSTRING(VarcharColumn,5,4), 106)
FROM UnnamedTable
WHERE TRY_CONVERT(date, SUBSTRING(VarcharColumn,1,2) + ' ' + SUBSTRING(VarcharColumn,3,3) + ' ' + SUBSTRING(VarcharColumn,5,4), 106) IS NOT NULL

然而,这:

我需要一个将这些 varchar 转换为日期并保留原始格式的脚本。

是一个无意义的要求。日期和时间数据类型不与任何显示格式信息一起保存。它们以二进制格式保存为日期、时间、日期时间等数据类型。如果您将该值保留为日期时间,则由客户端确定日期的显示方式。SELECT getdate()从 SSMS运行时,是SSMS确定显示格式。SQL Server 可以通过使用CONVERT()函数或FORMAT()函数将字段转换为 varchar 来完成格式化。但是,一般来说,最好在应用程序中格式化日期,就像使用货币一样。

于 2017-06-26T17:37:09.680 回答