как рассчитать год = 2019 и период = 6, чтобы дать 20106, а не число 20196 и год = 2018, период = 3112, чтобы дать 20183112 - PullRequest
0 голосов
/ 31 марта 2020

мне нужно объединить две таблицы на основе таймпериода. такой, что table1.dateperiod = table2. (комбинация периода и года) т. е. 201906 = 201906 (месяц 2019 года равен 6 обоим целым числам), т. е. 20183112 = 20183112

проблема заключается в том, как их объединить, если период равен 6 и такой, что после объединения это будет 201906, а не 20196 и

таблица 1

ID  NAME    DATE_PERIOD
1   conan   201906
1   conan   202012
1   conan   20183112
2   andy    201903

таблица2

ID  PROFILE YEAR    PERIOD
1   host    2019    6
1   writer  2018    3112
1   anchor  2020    12
2   sidekic 2019    3

пожалуйста, обратитесь к этой скрипте базы данных - здесь

select
 *
from table2 t2
inner join table1 t1 on t1.id = t2.id and t1.date_period= (t2.year*100+t2.period)

ожидаемое решение

ID  PROFILE YEAR    MONTH   ID  NAME    DATE_PERIOD
1   anchor  2020    12  1   conan   202012
1   host    2019    6   1   conan   201906
1   sidekick    2020    12  1   andy    202003
1   writer  2018    3112    1   conan   20183112

Ответы [ 3 ]

1 голос
/ 31 марта 2020

Если оба типа данных целое , вы должны иметь возможность построить вариант шестизначного git из года и месяца, просто используя:

year * 100 + month

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

concat(year, lpad(month, 2, '0'))

Sybase, с другой стороны, может использовать replicate для заполнения, но это гораздо страшнее, что-то вроде:

year || replicate('0', (2 - char_length(month))) || month

Не уверен какой тот, который вы хотите, поскольку вы дали оба тега.


И снова В вашем редактировании, где месяц также может содержать формат DDMM, вы можете просто использовать модуль Arithmeti c, чтобы получить последние два символа. Я не буду искать функцию для этого в Oracle / Sybase, я оставлю это в качестве упражнения для читателя. Достаточно сказать, что 3112 mod 100 это 12.

0 голосов
/ 31 марта 2020

Вы можете использовать ниже для обработки случаев, когда длина периода меньше или больше четырех

    select
       *
       from table2 t2,table1 t1 
       where t1.id = t2.id 
           and t1.date_period =  concat(year,
                         LPAD(period,
                   decode(length(period),1,2,3,4,length(period))
                               ,
                               0));
0 голосов
/ 31 марта 2020

Вам необходимо использовать LPAD следующим образом:

select
 *
from table2 t2
inner join table1 t1 
on t1.id = t2.id and t1.date_period= concat(year,LPAD(month,2,0))

См. db <> fiddle

- ОБНОВЛЕНИЕ -

Вы можете использовать оператор CASE следующим образом:

select
 *
from table2 t2
inner join table1 t1 on t1.id = t2.id 
and t1.date_period =  concat(year,
                             LPAD(period,
                                  case when length(period) <= 2 
                                       then 2 
                                       else 4 
                                   end,
                                   0))

db <> fiddle

...