2016-06-23 2 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: from x400 by nccwh-3.qs-va.comm.net с локальным (Exim 4.66) (конверт-от <[email protected]>) id 1aSdvU-0002xZ -3k для [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- Результат: 0 X-MessageSniffer-Rules: 0-0-0-2110-c [какой-то текст] Orig-To: [email protected] X-Originating-Ip: [redacted] Дата: ** 08 фев. 2016 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)) 

Это сравнивает две строки с датой вытащила из записи с помощью SUBSTRING И 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 и дня недели)

Leng th is: PATINDEX('%+0000%', SUBSTRING(EntryInfo, PATINDEX('%COMM.COM;%', EntryInfo) + 15, PATINDEX('%+0000%', EntryInfo)))-2 - Здесь были найдены конец индекс даты, ища первый индекс +0000 из строки, что удалил весь текст до первой даты. Это часть SUBSTRING. Мы вычитаем 2 для удаления дополнительного интервала.

Поиск второй даты с использованием аналогичной логики, но вместо этого используется «Дата:» в качестве индикатора начала строки.

Редактирование: правописание и исправление незначительной логики.

Обновленный запрос для соответствия обновленным данным примера.

+0

Примечание: оригинал не имеет двойной звездочки, это была ошибка форматирования (попытка сделать ее полужирным). Итак, для первого PATINDEX мы могли бы использовать ('COMM.COM;', .. вместо этого, исправить? –

+0

Если это согласовано во всех ваших записях данных, то да, вы могли бы использовать это вместо этого. Я должен быть чем-то вроде ' PAINTDEX ('% 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' Это выбирает первую дату. Таким образом, вы можете точно видеть, что она тянет, чтобы сравнивать –

Смежные вопросы