一尘不染

SQL:从字符串中提取日期

sql

有一个名为myDate的文本字段。该字段可以包含1)“结束 某日期 的会计年度”或2)“ dateA 到” dateB ”。

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

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

所有日期( someDatedateAdateB )都可以写为2000年1月1日,2000年1月1日或2000年1月1日。

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


阅读 460

收藏
2021-03-08

共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

…应该可以解决问题。我还没有真正测试过,但是希望它能给您足够的主意,以了解我的想法。

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

2021-03-08