【问题标题】:Coping with Date Nightmares应对约会噩梦
【发布时间】:2020-05-02 18:06:25
【问题描述】:

我目前正在处理我试图解开的字符串字段中的日期格式污水池。我只在 SQL Server 中工作。

我有一个字段,其日期到处都是。

有没有人知道可以提供帮助的好功能或 Github 项目?

例如我有类似的东西:

  • 酷文件 1 - 2018-05-12
  • 文件 2 04-18-20
  • 26.02.20 - 另一种疯狂的格式
  • shootmenow-2019.02-23.INeedAnAsprin
  • Impossible_But_Ill_Take_Whatever_10-11-12

我想从中得到一个规范化的数据,但对非法值进行一些基本的检查。

如果必须的话,我可以给它一个 ##.##.## 参数,但如果有什么神奇的东西可以采用 varchar 参数并吐出一个日期,我宁愿利用它。

任何你能指点我的东西都会很棒。

【问题讨论】:

  • 将数据加载到数据库中的表中并转换为date 列。 SQL Server 很少用于直接处理文件。
  • 可以构建一个快速存储的函数,但是对于没有完整年份部分的格式,在您为函数设置规则以决定何时返回 19XX 和 20XX 之前,它总是具有挑战性。例如:当 XX 在 00-20 之间时返回 20XX 和 21-99 返回 19XX。
  • 一般来说是做不到的。在许多情况下,如果您不确定格式,这些数字并不能确定确切的日期。我会尝试重新考虑这种方法。你能在别处得到日期吗?还是格式?

标签: sql-server date datetime


【解决方案1】:

一个正则表达式,或者更确切地说是 几个 正则表达式可以完成工作。问题是如何区分月份和日期,例如:Impossible_But_Ill_Take_Whatever_10-11-12
这是非常模棱两可的。在这种情况下,正则表达式无法神奇地分辨出月复一月,甚至一年。

  • 2018-05-12 易于处理 - 如果是 YYYY-MM-DD,则可以直接转换为日期
  • 至于26.02.20,假设年份是 2020 年,它可以使用“德语”格式转换为日期:SELECT CONVERT (datetime, '26.02.20', 4) - 请参阅 CAST and CONVERT - Transact-SQL
  • 至于04-18-20SELECT CONVERT (datetime, '04-18-20', 10)(美国格式)

恐怕您需要评估不同的场景并使用不同的方法。我会做的是:

  • 创建表的副本
  • 使用 LIKE 或正则表达式选择具有相似日期格式的记录,然后在目视检查后执行批量替换
  • 将记录标记为已完成

如果幸运的话,您会留下少量需要手动修复的行。 但我担心有些记录是无法恢复的,因为它们是模棱两可的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-21
    • 2020-03-14
    • 2010-11-13
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多