比较同一条目中的日期

时间:2016-06-23 17:28:31

标签: sql tsql sql-server-2012

我正在浏览一个数据库,并试图在没有相同日期的列中挑出条目。我的专栏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有点新意,并且不确定如何检查表中相同条目中​​的这些日期是否相同。我相信这些条目只是一个字符串。

感谢。

1 个答案:

答案 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 AND PATINDEX

从条目中提取的两个日期字符串

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:”作为字符串开头的指示符。

编辑:拼写和次要逻辑修复。

更新了查询以匹配更新的示例数据。