2016-02-15 4 views
3

Я поддерживаю отчет, который был разработан кем-то другим. Предложение WHERE содержит следующие 2 утверждения. Я не понимаю, что делает каждый и что делают отдельные части каждого из них. Любая помощь в понимании этих заявлений была бы весьма признательна. СпасибоВыражение объяснения

and rd.system_ci_date >= ADD_MONTHS(date - EXTRACT(day FROM date) + 1,-1) 
and (rd.system_ci_date - rd.ci_date) DAY(4) > 1 

ответ

3

ADD_MONTHS(date - EXTRACT(day FROM date) + 1,-1) возвращает первый день предыдущего месяца, чуть более эффективная версия ADD_MONTHS(date - (EXTRACT(day FROM date) - 1),-1)

(rd.system_ci_date - rd.ci_date) DAY(4) возвращает разницу между двумя датами в ИНТЕРВАЛ (который потерпит неудачу, если есть более чем 9999 дней между ними). Это то же самое, что и rd.system_ci_date - rd.ci_date, который возвращает INT.

Может быть, переписывая его

and rd.system_ci_date >= ADD_MONTHS(date - (EXTRACT(day FROM date) -1) ,-1) 
and rd.system_ci_date > rd.ci_date + 1 

немного легче понять

+0

@dnoeth ........ Спасибо ..... делает день (4) означают 9999 дней? Есть ли День (1), День (2), День (3) и т. Д.? Спасибо за вашу помощь – Shaves

+0

@Shaves: Да, 'n' в' DAY (n) 'указывает количество цифр, по умолчанию -' 2'. Максимум 9999 не очень большой, поэтому никто не использует эти стандартные SQL INTERVALs :-) – dnoeth

+0

@dnoeth ......... Спасибо. Я ценю время, которое вы приняли, чтобы помочь мне разобраться в этом. Я бухгалтер, который переводится в большую часть роли отчетности, и я в основном сам преподаю. Эти форумы очень помогли мне. еще раз спасибо – Shaves

0

rd.system_ci_date является сегодняшней датой

ADD_MONTHS(date - EXTRACT(day FROM date) + 1,-1) который будет возвращать в первый день предыдущего месяца.

(rd.system_ci_date - rd.ci_date) DAY(4) > 1 который дает разницу.

DAY(4) определяет 9999 дней

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