SQL:从字符串中提取日期

时间:2010-07-05 14:27:38

标签: sql sql-server regex

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

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

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

所有日期( someDate dateA dateB )可以写成2000年1月1日的1/1/2000,或者2000年1月1日。

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

1 个答案:

答案 0 :(得分:5)

这看起来并不复杂,不需要“正确”的正则表达式。这些文本日期可以通过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

......应该做的伎俩。我没有真正测试过,但希望它会给你足够的想法,看看我得到了什么。

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