我正在浏览一个数据库,并试图在没有相同日期的列中挑出条目。我的专栏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 <user@comm.net>) id 1aSdvU-0002xZ-3k for SERVER@COMM.COM; 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: SERVER@COMM.COM 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有点新意,并且不确定如何检查表中相同条目中的这些日期是否相同。我相信这些条目只是一个字符串。
感谢。
答案 0 :(得分: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))
从条目中提取的两个日期字符串
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;以及星期几)
长度为:PATINDEX('%+0000%', SUBSTRING(EntryInfo, PATINDEX('%COMM.COM;%', EntryInfo) + 15, PATINDEX('%+0000%', EntryInfo)))-2
- 通过从已删除之前的所有文本的字符串中查找+0000
的第一个索引,可以找到Date的 end 索引。第一次约会。这是SUBSTRING的一部分。我们减去2以消除额外的间距。
使用类似的逻辑查找第二个日期,而是使用“Date:”作为字符串开头的指示符。
编辑:拼写和次要逻辑修复。
更新了查询以匹配更新的示例数据。