DB2: двухмесячный запрос для отчета DB2 - PullRequest
0 голосов
/ 04 февраля 2020

В настоящее время я пишу Crystal Report, у которого в качестве внутреннего сервера используется запрос DB2. Я закончил запрос, но застрял на части даты его. Я собираюсь проводить его два раза в месяц - один раз 16-го и один раз 1-го следующего месяца. Вот как это должно работать:

  • Если я запусту его 16-го числа месяца, оно даст мне результаты с 1-го числа того же месяца до 15-го числа этого месяца.
  • Если я запусту его 1-го числа следующего месяца, он выдаст мне результаты с 16-го числа предыдущего месяца до последнего дня предыдущего месяца.

Это сводится к основам c двухмесячный отчет. Я нашел много подсказок, чтобы сделать это в T- SQL, но нет эффективных способов сделать это sh в DB2. Я с трудом нахожу голову на логику c, чтобы заставить ее работать последовательно, принимая во внимание различия в продолжительности месяца и тому подобное.

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

Существует 2 выражения для даты начала и окончания интервала в зависимости от пройденной даты отчета, которые вы можете использовать в своем предложении where.
Лог c выглядит следующим образом:
1) Если датой отчета является 1-й день месяца, то:
DATE_START - 16-е число предыдущего месяца
DATE_END - последний день предыдущего месяца
2) В противном случае :
DATE_START - 1-е число текущего месяца
DATE_END - 15-е число текущего месяца

SELECT
  REPORT_DATE
, CASE DAY(REPORT_DATE) WHEN 1 THEN REPORT_DATE - 1 MONTH + 15 ELSE REPORT_DATE - DAY(REPORT_DATE) + 1  END AS DATE_START
, CASE DAY(REPORT_DATE) WHEN 1 THEN REPORT_DATE - 1            ELSE REPORT_DATE - DAY(REPORT_DATE) + 15 END AS DATE_END
FROM 
(
VALUES 
  DATE('2020-02-01')
, DATE('2020-02-05')
, DATE('2020-02-16')
) T (REPORT_DATE);

Результат:

|REPORT_DATE|DATE_START|DATE_END  |
|-----------|----------|----------|
|2020-02-01 |2020-01-16|2020-01-31|
|2020-02-05 |2020-02-01|2020-02-15|
|2020-02-16 |2020-02-01|2020-02-15|
0 голосов
/ 04 февраля 2020

В Db2 (для Unix, Linux и Windows) это может быть WHERE условие, подобное

WHERE
 (CASE WHEN date_part('days', CURRENT date) > 15 THEN yourdatecolum >= this_month(CURRENT date) AND yourdatecolum < this_month(CURRENT date) + 15 days
  ELSE  yourdatecolum > this_month(CURRENT date) - 1 month + 15 DAYS AND yourdatecolum < this_month(CURRENT date)
  END)

Проверьте функцию THIS_MONTH - там Есть несколько способов сделать это. Также DAYS_TO_END_OF_MONTH может быть полезным

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