2014-04-30 49 views
0

我試圖從存儲爲nvarchar(max)的列中查詢最小日期時間。這個查詢有一些棘手的事情(至少對我來說)使用SQL Server 2008從字符串中提取最小時間戳

  • 在每條記錄中不止存儲日期。

  • 日期時間的位置是相對的 - 雖然它總是出現在格式**(DD-MM-YY at HH:MM PM

  • 有存儲在每個記錄多個日期時間 - 所以我不僅需要找到並捕獲那裏是一個datetime,我需要找到記錄中的最短日期時間

  • 我不能只是改變數據存儲的格式 - 有十多年的信息以這種方式存儲。

列被稱爲 'hdresp' - 這裏是樣本數據:

**(03-APR-14在上午09點44分發送的電子郵件) - 比利鮑伯鬆:升級訂購。 **(14年2月14日下午4點16分發送電子郵件) - Sammy Richards:如果您認爲這有助於升級,我可以再給你一個電纜。如果你想要走這條路線,我必須要求你提交另一個新硬件請求。 **(04年4月2日下午3點17分發送電子郵件) - 保羅史密斯:邁克爾當你有一秒鐘時,在我的辦公桌旁邊停下來。

  • 我想直到結束是標識02-Apr-14 at 3:17 PM作爲最小時間並將其轉換爲YYYY-MM-DD HH:MM:SS查詢 - 例如2014-04-02 15:17:00
+0

您可以用很容易找到日期/時間模式PATINDEX功能。但是,爲了在一條記錄中找到其中的一部分,您將不得不使用功能 – cha

+0

如果您可以假設第一個找到的模式最小(即它是電子郵件鏈中的第一封電子郵件),那麼您可以執行它使用一個簡單的更新SQL使用PATINDEX函數 – cha

+0

感謝您的及時響應! PATINDEX函數是不會返回日期時間的位置而不是實際值? – tubeysocks

回答

0

也許你可以試試這個方法:

select hdresp, min(ts) as timestamp 
from (
    select hdresp, cast(substring(hdresp,delta+3,10)+substring(hdresp,delta+15,9) as datetime2) as ts 
    from (
    select 
     hdresp, 
     charindex('**(',hdresp,1) as delta 
    from problem 
    union 
    select 
     hdresp, 
     charindex('**(',hdresp,1+charindex('**(',hdresp,1)) as delta 
    from problem 
    union 
    select 
     hdresp, 
     charindex('**(',hdresp,1+charindex('**(',hdresp,1+charindex('**(',hdresp,1))) as delta 
    from problem 
    union 
    select 
     hdresp, 
     charindex('**(',hdresp,1+charindex('**(',hdresp,1+charindex('**(',hdresp,1+charindex('**(',hdresp,1)))) as delta 
    from problem 
) as temp1 
    where delta > 0 
) as temp2 
group by hdresp 
; 

查看示例:http://sqlfiddle.com/#!3/a1a99/1 如果hdresp中有超過4個可能的時間戳,只需添加更多UNION SELECT...部分。

+0

我喜歡這種方法。儘管有4個以上的迴應的可能性。可能的答覆數量沒有限制。恐怕只是添加更多的UNION SELECT語句會減慢查詢速度。 – tubeysocks

+0

您可以運行一個查詢來查找最大數量,然後像我提到的那樣修改SQL,以添加更多'UNION SELECT ...'部分。我意識到這是笨重的,但SQL Server並不容易。查看更新的小提琴:http://sqlfiddle.com/#!3/30135/1 – Turophile

0

謝謝大家的幫助!

我結束了使用這種提取和從字符串轉換的最小時間:

SELECT CONVERT(datetime, REPLACE(LEFT(RIGHT(hdresp, PATINDEX('%(**%', REVERSE(hdresp)) - 1), 21), 'at ', '')) 
from tblhdmain 
where hdindex = 211458 

這給我的結果:

2014-04-02 15:17:00.000 
相關問題