2016-06-23 90 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' 这个选择第一个日期,这样你就可以看到它究竟是什么拉比较 –