2016-06-23 100 views
0

我正在瀏覽一個數據庫,並試圖挑選出不具有相同日期的列中的條目。我的專欄EntryInfo中的大多數條目都是這樣的;比較同一日期中的日期

| id | |      Entry Info      | 
    1  [randomInfo]<datetime1>[randomInfo]<datetime2>[randomInfo] 

實施例:

Received: from x400 by nccwh-3.qs-va.comm.net with local (Exim 4.66) (envelope-from <[email protected]>) id 1aSdvU-0002xZ-3k for [email protected]; Mon, 08 Feb 2016 04:59:52 +0000 X-Virus-Scanned: OK X-Spam-Threshold:95 X-Spam-Score: 0 X-Spam-Flag: NO X-MessageSniffer-Scan-Result: 0 X-MessageSniffer-Rules: 0-0-0-2110-c [some text] Orig-To: [email protected] X-Originating-Ip: [redacted] Date: 08 Feb 2016 04:59:52 +0000 Message-ID:<"15025881 0aa0 56b820c7"* @MHS>.. 

在大多數情況下<datetime1><datetime2>具有相同的日期。但有時DATE(<datetime1>) != DATE(<datetime2>)。這是我正在尋找的。我對使用SQL有點新,並且不確定如何檢查這些日期在表中的相同條目中​​是否相同。我相信條目只是一個字符串。

謝謝。

+1

你可以分享一些樣本'EntryInfo'條目,所以我們可以弄清楚如何分割數據? –

+0

希望它是可讀的@SujeetSinha '..Received:從x400通過nccwh-3.qs-va.comm.net本地(Exim 4.66)(信封 - 來自<[email protected]>)id 1aSdvU-0002xZ -3k for [email protected]; ** 2016年2月8日星期一04:59:52 ** +0000 X-Virus-Scanned:OK X-Spam-Threshold:95 X-Spam-Score:0 X-Spam-Flag:NO X-MessageSniffer-Scan-結果:0 X-MessageSniffer-Rules:0-0-0-2110-c [一些文本]原始發件人:[email protected] X-Originating-Ip:[redacted]日期:** 2016年2月08日04:59 :52 ** +0000 Message-ID:<「15025881 0aa0 56b820c7」* @MHS> ..' –

回答

1

好的,這會有點混亂 - 這假定所有條目都與您在評論中發佈的示例格式相同。它歸結爲比較條目的兩個子字符串。

讓我們從代碼開始吧。這將拉動地方的日期不同所有條目:

SELECT * FROM TestTable 
WHERE (SUBSTRING(EntryInfo, PATINDEX('%COMM.COM;%', EntryInfo) + 15, PATINDEX('%+0000%', SUBSTRING(EntryInfo, PATINDEX('%COMM.COM;%', EntryInfo) + 15, PATINDEX('%+0000%', EntryInfo)))-2)) 
<>(SUBSTRING(EntryInfo, PATINDEX('%Date:%', EntryInfo) + 6, PATINDEX('%+0000%', SUBSTRING(EntryInfo, PATINDEX('%Date:%', EntryInfo) + 6, PATINDEX('%+0000%', EntryInfo)))-1)) 

使用SUBSTRINGPATINDEX

SUBSTRING將查找字符串的一部分,與此相比,從入門拉兩個日期字符串。它需要源字符串(在列名稱的情況下),起始索引(我們使用PATINDEX)和長度。

PATINDEX將返回您從源字符串中提供的模式的起始索引。

在這裏,我們拉的第一個日期字符串:

(SUBSTRING(EntryInfo, PATINDEX('%COMM.COM;%', EntryInfo) + 15, PATINDEX('%+0000%', SUBSTRING(EntryInfo, PATINDEX('%COMM.COM;%', EntryInfo) + 15, PATINDEX('%+0000%', EntryInfo)))-2)) 

源字符串是:EntryInfo

開始指數:PATINDEX('%COMM.COM;%', EntryInfo) + 15 - 在這裏,我們正在尋找的第一個是開始索引COMM.COM;(並添加15取消COMM.COM;以及星期幾)

Leng th是:PATINDEX('%+0000%', SUBSTRING(EntryInfo, PATINDEX('%COMM.COM;%', EntryInfo) + 15, PATINDEX('%+0000%', EntryInfo)))-2 - 在這裏是通過尋找的+0000從一個字符串,該已刪除第一日期之前的所有文本中的第一個索引被找到年底指數的日期的。這是這個的SUBSTRING部分。我們減去2來消除額外的間距。

使用類似的邏輯找到第二個日期,而是使用「Date:」作爲字符串開始的指示符。

編輯:拼寫和次要邏輯修復。

已更新的查詢以匹配更新的示例數據。

+0

注意:原文沒有雙星號,這是一個格式錯誤(試圖使其爲粗體)。 因此,對於第一個PATINDEX,我們可以使用('COMM.COM;',..,而不是正確的? –

+0

如果這在所有數據條目中是一致的,那麼是的,您可以使用它, PATINDEX('%COMM.COM;%',EntryInfo)+ 15'代替 我建議您一次只選擇一個日期,以幫助您準確獲得所需內容: –

+0

@PaulV像這樣'SELECT(SUBSTRING(EntryInfo, PATINDEX('%COMM.COM;%',EntryInfo)+ 15,PATINDEX('%+ 0000%',SUBSTRING(EntryInfo,PATINDEX('%COMM.COM;%',EntryInfo)+ 15,PATINDEX('%+ 0000%',EntryInfo))) - 2))FROM TestTable' 這個選擇第一個日期,這樣你就可以看到它究竟是什麼拉比較 –