2010-07-05 154 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日?