Возврат всех дат в формате дд / мм / гг за последние 6 месяцев - PullRequest
0 голосов
/ 11 октября 2018

Я хочу вернуть все дни за последние 6 месяцев.

Например:

Column1
-------
01-OCT-18
30-SEP-18
29-SEP-18
........
01-APR-18

@ TimBiegeleisen - Ваше решение направило меня в правильном направлении, поэтому вы получитеpoints.

@ MT0 - "ADD_MONTHS", насколько я знаю, не используется в T-SQL, поэтому пояснение, которое я считаю, было необходимо.но спасибо за указатель с обновлениями, воздержусь от этого в будущем.

Ответы [ 4 ]

0 голосов
/ 11 октября 2018

Я добавлю к нему больше, однако это была начальная точка, в которой я нуждался, я слишком усложнил запрос, пытаясь использовать «CONNECT BY LEVEL» запрос, который у меня был раньше, работал нормально для дат в будущем, но ничего не возвращалдо sysdate (я немного поэкспериментирую с вышеизложенным, чтобы выяснить, как это работает, но пока знаю достаточно).

Спасибо за ответ, я смог найти решениеза то, что я хотел через следующее:

SELECT  col1
FROM    table1
WHERE   col1 >= add_months(sysdate,-6)
0 голосов
/ 11 октября 2018

Это даст вам все даты (в формате в вашем примере) за последние 6 месяцев:

SQL Fiddle

Запрос 1 :

SELECT TO_CHAR( SYSDATE - LEVEL + 1, 'DD-MON-RR' ) AS Column1
FROM   DUAL
CONNECT BY SYSDATE - LEVEL + 1 >= ADD_MONTHS( SYSDATE, -6 )

Результаты :

|   COLUMN1 |
|-----------|
| 11-OCT-18 |
| 10-OCT-18 |
| 09-OCT-18 |
...
| 13-APR-18 |
| 12-APR-18 |
| 11-APR-18 |

Обновление

Идея состоит в том, чтобы создать список дней за последние 6 месяцев и подсчитать, сколько раз определенное значение было записано для каждой даты

SQL Fiddle

Настройка схемы Oracle 11g R2 :

Создание примера таблицы с несколькими строками для разных дней:

CREATE TABLE table_name ( value ) AS
          SELECT TRUNC( SYSDATE ) - 0 FROM DUAL CONNECT BY LEVEL <= 5
UNION ALL SELECT TRUNC( SYSDATE ) - 1 FROM DUAL CONNECT BY LEVEL <= 3
UNION ALL SELECT TRUNC( SYSDATE ) - 2 FROM DUAL CONNECT BY LEVEL <= 7
UNION ALL SELECT TRUNC( SYSDATE ) - 3 FROM DUAL CONNECT BY LEVEL <= 2
UNION ALL SELECT TRUNC( SYSDATE ) - 4 FROM DUAL CONNECT BY LEVEL <= 1

Запрос 1:

SELECT TO_CHAR( c.Column1, 'DD-MON-RR' ) AS Column1,
       COUNT( t.value ) AS num_values_per_day
FROM   (
         SELECT TRUNC( SYSDATE ) - LEVEL + 1 AS Column1
         FROM   DUAL
         CONNECT BY TRUNC( SYSDATE ) - LEVEL + 1 >= ADD_MONTHS( SYSDATE, -6 )
       ) c
       LEFT OUTER JOIN table_name t
       ON ( c.column1 = t.value )
GROUP BY c.Column1
ORDER BY c.Column1 DESC

Результаты :

|   COLUMN1 | NUM_VALUES_PER_DAY |
|-----------|--------------------|
| 11-OCT-18 |                  5 |
| 10-OCT-18 |                  3 |
| 09-OCT-18 |                  7 |
| 08-OCT-18 |                  2 |
| 07-OCT-18 |                  1 |
| 06-OCT-18 |                  0 |
| 05-OCT-18 |                  0 |
...
| 14-APR-18 |                  0 |
| 13-APR-18 |                  0 |
| 12-APR-18 |                  0 |
0 голосов
/ 11 октября 2018

Так что для дополнительной задачи, представленной в вашем комментарии, вы можете немного изменить решение Тима Бигелайзенса:

SELECT TRUNC(Column1) AS "Day"
     , count(*) as "Count"
  FROM yourTable
 GROUP BY TRUNC(Column1)
 WHERE Column1 >= ADD_MONTHS(SYSDATE, -6);
0 голосов
/ 11 октября 2018

Мы можем сравнить каждую дату в Column1 с SYSDATE, 6 месяцами ранее, а затем отобразить даты в нужном формате, используя TO_CHAR с соответствующей маской формата:

SELECT
    TO_CHAR(Column1, 'dd/mm/yy') AS output
FROM yourTable
WHERE
    Column1 >= ADD_MONTHS(SYSDATE, -6);

Демо

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