2010-07-05 69 views
3

有一个名为myDate的文本字段。该字段可以包含1)'会计年度结束someDate'或2)'dateA'dateB'。SQL:从字符串提取日期

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

在情况2)中,我想要设置的字段日期1 = dateA和场DATE2 = dateB

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

我怎么去从myDate中提取日期并将它们插入到正确的字段中?

+3

这是可怕的设计。如果它甚至是一个模糊的选项,则需要备份改变处理日期和日期范围的方式。 – Donnie 2010-07-05 14:46:07

+2

@donnie这实际上是一件可怕的事情,但令人遗憾的是,我经常不得不这样做,主要是在将旧的电子表格和神识转化为适当的系统时。也许@dmr没有应对糟糕的设计,因此呢?我相信他会告诉我们:) – 2010-07-05 15:03:26

+0

谢谢你的防御@Matt。正如你所说的,我试图将数据从遗留系统导入新的,设计合理的系统。 – dmr 2010-07-05 15:09:45

回答

4

这看起来不够复杂,需要一个“正确的”正则表达式。这些文本的日期可以直接解析成由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日?