【问题标题】:SQL SERVER: How to Preserve "DateFormat" in Convert VARCHAR to Date with multiple Date formatsSQL SERVER:如何在将 VARCHAR 转换为具有多种日期格式的日期中保留“DateFormat”
【发布时间】:2017-06-26 16:31:34
【问题描述】:

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

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


DDMMMYYYY

DD/MM/YYYY

MM/DD/YYYY

....


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

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

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

【问题讨论】:

  • 在输入日期可能是 DD/MM/YYYY 或 MM/DD/YYYY 的情况下,如何判断 01/02/2017 是 2017 年 1 月 2 日还是 2017 年 2 月 1 日?
  • 不存在日期格式不明确的解决方案。
  • 停止将日期存储在 varchar 中,您将不会遇到此问题。否则,您将继续头疼,并且会像您在这里遇到的那样不断遇到无法解决的情况。
  • 我理解模棱两可的情况,并且我有一个解决方法(与连续的其他日期字段进行比较)。我无法控制数据创建过程,这就是它的本质。

标签: sql sql-server date datetime-format sql-convert


【解决方案1】:

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

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

【讨论】:

  • 输入是一个varchar,因此它被格式化。我理解模棱两可的情况;但我可能会根据最后一个知道(明确)的情况对其进行解析。
  • 我不明白你的意思是什么时候根据最后一个已知的明确案例来解析不明确的格式。
  • 我有另一个日期列,它存储一个相同值但格式不同的日期。我可以比较这两个值并确保它们一致
  • @MeysaM,如果您有 2 个日期应该具有相同的值,那么这种方法应该可以工作。如果您需要这方面的帮助,请将这些详细信息添加到您的问题中,并为您正在使用的特定 SQL Server 版本添加标签。
【解决方案2】:

如果您使用的是 SQL Server 2012 或更高版本,则可以使用 TRY_CONVERT() 函数。您可以使用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 转换为日期的脚本,保留原始格式。

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

【讨论】:

    猜你喜欢
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    相关资源
    最近更新 更多