I'd do this in stages. Create a view where for each table you summarise totals by the month, you'll need to use extract or date_part to split the date into yearand month integer fields, which you'll group by, and sum to get the monthly totals. Then your joining of the two views becomes trivially easy.

There most definitely is a one-query solution. You'd effectively have to do both stages of the route I suggested in one go, using subqueries and a union.

Using views to simplify the process is not really a compromise, that's what they are there for. If you don't want them to be mixed in with your everyday database objects, use a separate schema (again, that's what they are there for!)

The good thing about doing it in stages is that it makes debugging much easier. If your results look a bit iffy or don't perform well and you need to start deconstructing a huge query with subqueries in order to begin working out what's wrong, the additional complexity becomes a burden. If your final query is simple and the views that it relies on are simple it's easier to find the problem. Better still, when you fix or optimise it, all the things that rely on it will automatically improve.

I guess WITH is not an operator. Was it a typo ? I get error using that.

So I tried using SELECT there. BUT I get the error

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '( SELECT YEAR([Date]) As [Year] , MONTH([Date]) AS [Month] ' at line 1

With an earlier Version of MySQL I would suggest to use a View instead.
Basically put that statement from the WITH clause into a View like this:

MySQL-Syntax:

CREATE VIEW `aggregateddata` AS
select year(`tb1`.`Date`) AS `Year`
,month(`tb1`.`Date`) AS `Month`
,sum(`tb1`.`Cr`) AS `Cr`
,sum(`tb1`.`Dr`) AS `Dr`
from `tb1`
group by year(`tb1`.`Date`)
,month(`tb1`.`Date`)
union
select year(`tb2`.`Date`) AS `Year`
,month(`tb2`.`Date`) AS `Month`
,sum(`tb2`.`Cr`) AS `Cr`
,0 AS `Dr` from `tb2`
group by year(`tb2`.`Date`)
,month(`tb2`.`Date`);

And then you can use it the same way with a simple query:

select `Year`
, `Month`
,sum(`Cr`) AS `Cr`
,sum(`Dr`) AS `Dr`
from `aggregatedData`
group by `Year`
,`Month`