По поводу даты в sql - PullRequest
       14

По поводу даты в sql

2 голосов
/ 13 августа 2010

Вот мой запрос:

select * 
 from test n
WHERE lower(process_name) like 'test%'
  AND (   test_id is NULL 
       OR TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE),-6),'YYYYMM') > TO_CHAR(n.process_date,'YYYYMM')

Я хочу проверить, является ли поле даты process_date больше 6 месяцев в запросе.

Ответы [ 3 ]

3 голосов
/ 13 августа 2010

У меня нет экземпляра Oracle, пригодного для проверки, будет ли Oracle выполнять неявное преобразование типов данных для результатов TO_CHAR, так как оно будет полностью числовым. Тем не менее, мне кажется слишком сложным при сравнении со значением TRUNC'd DATE ...

Для записей, которые в Oracle старше шести месяцев:

n.process_date <= ADD_MONTHS(TRUNC(SYSDATE), -6)

Если вы хотите старше, но не включая шесть месяцев точно - удалите оператор равенства:

n.process_date < ADD_MONTHS(TRUNC(SYSDATE), -6)

Для записей, которые старше шести месяцев в MySQL:

n.process_date <= DATE(DATE_SUB(NOW(), INTERVAL 6 MONTH))

Если вы хотите старше, но не включая шесть месяцев точно - удалите оператор равенства:

n.process_date < DATE(DATE_SUB(NOW(), INTERVAL 6 MONTH))

Для MySQL DATE работает аналогично Oracle TRUNC.

1 голос
/ 13 августа 2010
SELECT *
  FROM test
 WHERE MONTHS_BETWEEN( SYSDATE, process_date ) > 6

MONTHS_BETWEEN (дата1, дата2) возвращает (дата1 - дата2), поэтому порядок аргументов имеет значение

Если вы хотите, чтобы числа месяцев отличались на 6, например, если это неправильно для вас

    MONTHS_BETWEEN( 'JUN 13 2010', 'JAN 16 2010') == 5.9 

Тогда вы должны:

SELECT *  
  FROM test
 WHERE MONTHS_BETWEEN( LAST_DAY(SYSDATE), LAST_DAY(process_date) ) >= 6

Последние дни месяцев гарантированно правильно сравниваются и возвращают целое число


ПРИМЕЧАНИЕ : оба этих запроса не будут использовать индекс для "process_date", если он доступен. «Индексированное» решение см. сообщение OMG Ponies и комментарии к этому

0 голосов
/ 13 августа 2010

Если вы используете SQL Server, вы можете использовать DATEDIFF ().Пример ниже.

DECLARE @a AS DATETIME = '2010-6-1 00:00'; -- Assignment and declaration in SQLS2008
DECLARE @b AS DATETIME = '2010-8-16 00:15';

-- usage: DATEDIFF(Interval, StartDate, EndDate)

SELECT      DATEDIFF(MONTH, @a, @b) AS MonthDifference,
            DATEDIFF(HOUR, @a, @b) AS HourDifference,
            DATEDIFF(MINUTE, @a, @b) AS MinuteDifference;

Вы можете вычесть ответ из этого.Пожалуйста, дайте мне знать, если я пропустил цель.

Спасибо.

...