【问题标题】:SQL Server 2005 varchar with data ddmmyyyy to datetime formatSQL Server 2005 varchar 与数据 ddmmyyyy 到日期时间格式
【发布时间】:2016-07-11 02:26:25
【问题描述】:

我的应用程序数据库表 JOB 中有一个列完成日期,其数据类型为 varchar(16)(很奇怪),但该列以任意格式存储日期值,例如 yyyyddmm(例如 - 19841511)、yyyymmdd(例如- 19841215),ddmmyyyy(例如 - 01012007)。

我只想将数据转换为一种统一的日期时间格式,这是 SQL Server 2005 的默认日期时间格式,即

yyyy-mm-dd 00:00:00.000

你们能帮我解决这个问题吗?

提前致谢!

【问题讨论】:

  • 你将如何确定像 20121001 这样的值是什么日期?
  • 好吧,假设它是 01'Oct 2012 ,别无选择地去判断这是对还是错,这就是为什么我说各种任性的格式转换为 1 个统一的日期时间字段,让查询弄清楚。
  • 可爱,日期格式根本不正确。我希望你知道哪些是格式化的。 ://

标签: sql-server date datetime


【解决方案1】:

嗯,我希望你有一个系统的方法来知道哪一行以哪种方式存储,因为DATETIME 没有默认格式并且你的字符串以错误的格式存储...就像那个格式SQL 中不存在。没有外界的帮助,SQL 是无从得知的。

  • 没有YYYY-DD-MM 格式的日期。看起来像定制的工作。 :/
  • VARCHAR(16) 也意味着您的DATETIME 格式中没有任何秒数...耶! :(

除非您事先知道哪些日期的格式是什么,否则如果不返回发布这些“日期”的来源,几乎不可能解决这个问题。

SELECT CASE WHEN ISDATE('19841511') = 0
        THEN  SUBSTRING('19841511', 1, 4) + '-'  --YEAR
            + SUBSTRING('19841511', 7, 2) + '-'  -- MONTH
            + SUBSTRING('19841511', 5, 2) END AS [YYYY-MM-DD]
     , CASE WHEN ISDATE('01012007') = 0
        THEN SUBSTRING('01012007', 5, 4) + '-' --YEAR
            + SUBSTRING('01012007', 3, 2) + '-' --MONTH
            + SUBSTRING('01012007', 1, 2) END AS [YYYY-MM-DD]

注意这两种格式的区别...并且两种格式都不是以 SQL Server 识别的日期格式存储的。

  • DATETIME2 确实使用您正在寻找的默认格式 YYYY-MM-DD hh:mm:ss[.fractional seconds]

希望这至少能让你找到正确的答案!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多