преобразовать дату в sql для сравнения дат - PullRequest
0 голосов
/ 22 декабря 2010

извлечение элементов из таблицы, попадающих в диапазон дат.

дата (имя поля таблицы базы данных называется: submission_date ) сохраняется в базе данных как d-M-y ( ex: 21-Dec-10 )

Это хранится в базе данных оракула, как sysdate. (он должен оставаться в базе данных в качестве этого формата, поэтому изменение формата его хранения не вариант)

Я хочу преобразовать 21 декабря 2010 в 20101221, чтобы я мог сравнить его с датой публикации пользователем. Это два значения: end_date, begin_date

Все, что мне нужно, это правильно преобразовать submission_date в Ymd ( 20101221 )

ниже теоретически, что я хочу сделать:

select 
 * 
from 
 table 
where 
 (convert(Ymd=>submission_date) >= $begin_date 
AND 
 convert(Ymd=>submission_date) <= $end_date)

Ответы [ 2 ]

5 голосов
/ 22 декабря 2010

Когда вы сказали,

Это хранится в базе данных оракула, как sysdate.

Мне говорят, что тип столбца - ДАТА.

Для начала давайте отвергнем представление о том, что DATE хранится в строковом формате в Oracle. Это совершенно ошибочно.

Если тип данных столбца - DATE, то фактическое значение сохраняется с использованием 7 байтов, но его можно рассматривать как число. Тот факт, что когда вы запрашиваете его для проверки значения, вы видите формат dd-mon-yy, является функцией настроек NLS или параметров клиента. Помните, что Oracle - это сервер, любой инструмент, который позволяет вам просматривать информацию, хранящуюся на этом портале. Другими словами, вы на самом деле не смотрите на данные, вы смотрите на то, что пошло и получило данные, а затем поместило их на экран, чтобы вы могли их увидеть. имеет смысл?

Хорошо, теперь, когда вы знаете, что DATE хранится в определенном формате, не существует, DATE MATH становится простым.

SELECT Submission_date FROM tab 

Возвращает дату, отформатированную в виде строки на основе настроек клиента или настроек NLS.

SELECT Submission_date - 1 FROM tab 

Возвращает дату, совпадающую с днем, на один день раньше

Обратите внимание, что мне не нужно было делать сумасшедшие вещи с номером 1, чтобы выполнить математику даты, и это потому, что тип данных даты поддерживает математическую обработку, которая работает так, как будто это число, поэтому вычитание - простая вещь.

Если ваши переменные $ begin_date передаются в Oracle как даты, то им тоже ничего не нужно делать, потому что, опять же, их можно использовать как числа.

WHERE Submission_date МЕЖДУ $ Begin AND $ End будет работать.

Бонусный материал

МЕЖДУ включительно на обоих концах.

Больше бонусов

Дата на самом деле хранится так:

Byte 1 -> Century
Byte 2 -> Year
Byte 3 -> Month
Byte 4 -> Day
Byte 5 -> Hour
Byte 6 -> Minute
Byte 7 -> Second

Это позволяет поддерживать очень широкий диапазон дат. Это действительно математическая библиотека дат, которая может заставить этот тип данных делать классные вещи, такие как добавлять високосные годы и получать преобразование из юлианского в григорианский и тому подобное.

Бонусный материал Redux

SQL Server хранит даты в виде двух 4-байтовых целых чисел, упакованных вместе в BINARY (8). Первые 4 байта - это прошедшие дни с базовой даты SQL Server 01.01.1900. Вторые 4 байта хранят время суток, представленное числом миллисекунд после полуночи, в квантах 3,33 миллисекунды.

Ошибочно полагать, что, если значение может быть сохранено, СУБД поддерживает его. Я полагаю, что SQL Server вообще не обрабатывает даты BC и не хорошо обрабатывает даты в будущем, как в 9999. MSSS2008 действительно представил новый тип данных для работы с этими большими датами.

5 голосов
/ 22 декабря 2010

Если столбец submission_date имеет тип данных DATE, а $ begin_date и $ end_date представляют собой строки в формате ггггммдд, то вы можете использовать следующий запрос для получения строк, попадающих в диапазон дат:

SELECT *
  FROM tab
 WHERE submission_date BETWEEN 
        TO_DATE ( $begin_date, 'yyyymmdd') AND 
        TO_DATE ( $end_date, 'yyyymmdd');

По не применяя функцию для submission_date, мы даем Oracle возможность использовать индекс для этого столбца, если индекс существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...