Если предположить, что значения таблицы A всегда разнесены на один месяц и установлены 1-го числа каждого месяца, существующие ответы подойдут.
Если ваша таблица А может содержать больше разнообразия:
SELECT
*
FROM
TableB b
inner join
TableA a
on
b.dateb >= a.datea
left join
TableA a_nolater
on
a_nolater.datea > a.datea and
b.dateb >= a_nolater.datea
WHERE
a_nolater.seq is null
Это объединяет две таблицы вместе, а затем пытается найти «лучшее» объединение (строка из таблицыa, которая встречается позже, чем текущая совпадающая, и все равно будет совпадать для tableb). Он возвращает только те строки, в которых он не может найти это «лучшее» соединение. Таким образом, он находит последнюю строку с датой в таблице A, которая находится на или перед датой из таблицы B.