這看起來不夠複雜,需要一個「正確的」正則表達式。這些文本的日期可以直接解析成由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