【问题标题】:How do I display varchar date string with mixed format to another format?如何将混合格式的 varchar 日期字符串显示为另一种格式?
【发布时间】:2013-01-09 01:14:30
【问题描述】:

我正在使用 SQL Server 2008 R2。我知道我可以使用具有不同格式代码的 CONVERT 作为第三个参数,首先转换为 DATETIME,然后再使用另一种格式代码转换为 VARCHAR 以更改显示格式。

现在真正的问题是我在单个列中混合了原始数据。所以我的问题是如何编写一个 SELECT 语句来显示从混合的 YYYY/MM/DD、DD/MM/YYYY 到 DD/MM/YYYY?

我尝试使用 ISDATE() 但它认为 31/01/2013 不是日期,而 01/01/2013 是日期。现在只能想到看YYYY是在左边还是右边来确定正确的输入格式,但是我不知道如何在单个SELECT语句中写出来。

任何先更改格式然后执行简单 SELECT 的程序都不是一种选择。我不允许更改来源。

谢谢

【问题讨论】:

  • 您编写CASE 语句来检查第三个字符是否为整数。如果是,那么你知道第一组不是一年。
  • 我喜欢你的!太棒了!
  • 你真的应该争取取消限制以更改来源。头脑正常的人都不应该将各种格式的日期存储为字符串!

标签: sql sql-server-2008 date


【解决方案1】:

为什么不直接使用字符串操作呢?比如:

select (case when substring(d, 5, 1) = '/'  -- YYYY/MM/DD
             then right(d, 2)+'/'+substring(6, 2)+'/'+left(d, 4)
             else d
        end)

顺便说一句,如果您选择以字符串形式表示的日期格式,我强烈推荐 YYYY-MM-DD(或 YYYY/MM/DD),因为比较运算符适用于它们。

【讨论】:

  • 谢谢!我不知道哪个更好,但如果我真的想更改为另一种日期格式进行显示(只需更改最后一个格式代码),将来可能转换为日期更容易维护
【解决方案2】:

如果您确定数据中仅存在这 2 种格式(yyyy/mm/dd 和 dd/mm/yyyy),那么您可能会使用 CASE 语句,如下所示:

CASE
  WHEN (SUBSTRING(dateColumn, 5, 1) = '/') THEN CONVERT(datetime, dateColumn, 111)
  ELSE CONVERT(datetime, dateColumn, 103)
END

【讨论】:

  • 现在只有两种变体和垃圾(根本不是日期格式)。我希望这就足够了。
  • @camila_c 。 . .亚伦很好。您的响应在语法上不是正确的 SQL,并且它与 SQL Server 的 SQL 不兼容。 convert 的第三个参数是一个整数。
  • @GordonLinoff 谢谢,没有注意并忘记格式是整数值。更新更正。
  • 请在发布之前测试您的代码示例,尤其是那些简单的,大约需要 4 秒来测试。前三分钟有 3 次赞成票,很可能有读者过来并认为他们发现了CONVERT 的一些新扩展...
  • @chamila_c:您仍然缺少CASE 表达式中的END
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
相关资源
最近更新 更多