Дата в числовом поле c Тип данных, сгруппировать по месяцам, используя SQL Разработчик - PullRequest
0 голосов
/ 03 февраля 2020

Мне было поручено запросить базу данных, используя SQL Developer, где дата указана в поле типа "цифра c" (например, "20190101"). Просьба предоставить выходные данные по месяцам и годам, поэтому DATEID между 20190101 и 20190131 будет январь 2019 года. После поиска в Интернете я действительно затрудняюсь, как это упростить, поэтому мне не нужно запускать отдельный запрос за каждый месяц. Может ли кто-нибудь дать какое-нибудь руководство?

Ответы [ 3 ]

0 голосов
/ 03 февраля 2020

Вы можете сделать это, используя to_date, чтобы преобразовать число в тип данных DATE, а затем trunc, чтобы усечь его до первого числа месяца, или to_char, чтобы превратить его в месяц + год, например:

SELECT SYSDATE,
       TRUNC(SYSDATE, 'mm') mnth_yr1,
       to_char(SYSDATE, 'fmMonth yyyy') mnth_yr2
FROM   dual;

SYSDATE             MNTH_YR1    MNTH_YR2
------------------- ----------- --------------
03/02/2020 15:56:02 01/02/2020  February 2020

Обратите внимание на использование fm в маске формата to_char - это заставляет Месяц выводить только символы в месяце, вместо добавления дополнительных пробелов, чтобы сделать его такой же длины, как самый длинный month.

Получив месяц / год, вы можете использовать его для группировки в агрегированном запросе, например:

SELECT TRUNC(your_num_col, 'mm') mnth_yr,
       SUM(your_value_col)
FROM   your_table
GROUP BY TRUNC(your_num_col, 'mm');
0 голосов
/ 19 февраля 2020

Другой ответ

SELECT TO_CHAR(TO_date(20190101, 'YYYYMMDD'), 'MONTH YYYY') AS SOME_DATE FROM dual;

#result
SOME_DATE     |
--------------|
JANUARY   2019|
0 голосов
/ 03 февраля 2020

Я бы просто поделил числовое значение c на 100 и сохранил бы целую часть. Это простой способ извлечь часть года и месяца: например, для любого числа от 20190101 до 20190131 это даст 201901.

В большинстве баз данных вы можете express это с floor():

select floor(mycol / 100), <some aggregate expressions>
from mytable
group by ceil(mycol / 100)
...