这看起来不够复杂,需要一个“正确的”正则表达式。这些文本的日期可以直接解析成由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日,3/4/2000是4月3日或3月4日?
这是可怕的设计。如果它甚至是一个模糊的选项,则需要备份改变处理日期和日期范围的方式。 – Donnie 2010-07-05 14:46:07
@donnie这实际上是一件可怕的事情,但令人遗憾的是,我经常不得不这样做,主要是在将旧的电子表格和神识转化为适当的系统时。也许@dmr没有应对糟糕的设计,因此呢?我相信他会告诉我们:) – 2010-07-05 15:03:26
谢谢你的防御@Matt。正如你所说的,我试图将数据从遗留系统导入新的,设计合理的系统。 – dmr 2010-07-05 15:09:45