【问题标题】:SQL: extract date from stringSQL:从字符串中提取日期
【发布时间】:2010-07-05 14:27:37
【问题描述】:

有一个名为 myDate 的文本字段。此字段可以包含 1) '财政年度结束 someDate' 或 2) 'dateA 到 'dateB'。

在情况 1) 中,我想将字段 date1 = 设置为 someDate

在情况 2) 中,我想设置字段 date1 = dateA 和字段 date2 = dateB

所有日期(someDatedateAdateB)可以写成 1/1/2000、2000 年 1 月 1 日或2000 年 1 月 1 日。

如何从 myDate 中提取日期并将它们插入到正确的字段中?

【问题讨论】:

  • 这是可怕的设计。如果它甚至是一个模糊的选项,您需要备份更改您处理日期和日期范围的方式。
  • @donnie 这确实是一件可怕的事情,但遗憾的是我经常不得不做这样的事情,主要是在将旧的电子表格和天知道的东西转换成适当的系统时。也许@dmr 没有应对糟糕的设计?我相信他会告诉我们的:)
  • 感谢您的辩护@Matt。正如您所说,我正在尝试将数据从旧系统导入到设计合理的新系统中。

标签: sql sql-server regex


【解决方案1】:

这看起来不够复杂,不需要“适当的”正则表达式。这些文本日期可以通过 SQL 直接解析为 DATETIME 类型,而无需进行任何处理,正如您通过运行此查询所看到的那样:

SELECT CAST('1/1/2000' AS DATETIME), CAST('January 1, 2000' AS DATETIME), CAST('Jan 1, 2000' AS DATETIME)

要获得 -1 年零 +1 天,只需使用 DATEADD,例如

SELECT DATEADD(dd, 1, DATEADD(yy, -1, 'January 1 2000'))

...所以,你真正需要做的就是处理你的两个不同的情况并抓住日期。所以,类似:

SELECT
  CASE 
    WHEN myDate LIKE 'fiscal year ending %' THEN CAST(DATEADD(dd, 1, DATEADD(yy, -1, REPLACE(myDate, 'fiscal year ending ', ''))) AS DATETIME) 
    ELSE CAST(LEFT(myDate, PATINDEX('% to %', myDate)) AS DATETIME)
  END 'FromDate',
  CASE
    WHEN myDate LIKE 'fiscal year ending %' THEN CAST(REPLACE(myDate, 'fiscal year ending ', '') AS DATETIME)
    ELSE CAST(SUBSTRING(myDate, PATINDEX('% to %', myDate) + 4, 100) AS DATETIME)
  END 'ToDate'
FROM 
  ...whatever

...应该可以解决问题。我还没有真正测试过,但希望它能给你足够的想法,看看我在做什么。

请注意,某些结果可能取决于您的服务器/数据库的语言设置。例如,虽然 2000 年 1 月 1 日始终是 1 月 1 日,但 2000 年 3 月 4 日是 4 月 3 日还是 3 月 4 日?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2019-12-22
    • 2020-08-14
    • 2016-06-24
    • 1970-01-01
    相关资源
    最近更新 更多