У меня есть следующий пример данных, запроса и результата:
DROP TABLE IF EXISTS calendar;
CREATE TABLE `calendar` (
`day_date` date NOT NULL,
PRIMARY KEY (`day_date`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
DROP TABLE IF EXISTS finance;
CREATE TABLE `finance` (
`finance_id` int(11) NOT NULL,
`timestamp` datetime(0) NOT NULL,
`debit` int(11) NULL DEFAULT NULL,
`credit` int(11) NULL DEFAULT NULL,
PRIMARY KEY (`finance_id`) USING BTREE,
UNIQUE INDEX `finance_id`(`finance_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
insert into `calendar` values
('2020-01-01'),
('2020-01-02'),
('2020-01-03'),
('2020-01-04'),
('2020-01-05');
insert into finance values
(1, '2020-01-02 00:00:00', 100, 0),
(2, '2020-01-04 9:00:00', 200, 0);
select day_date , finance.`timestamp`, debit
from calendar
left join finance on calendar.day_date = date(finance.`timestamp`);
+------------+---------------------+-------+
| day_date | timestamp | debit |
+------------+---------------------+-------+
| 2020-01-02 | 2020-01-02 00:00:00 | 100 |
| 2020-01-04 | 2020-01-04 09:00:00 | 200 |
| 2020-01-01 | NULL | NULL |
| 2020-01-03 | NULL | NULL |
| 2020-01-05 | NULL | NULL |
+------------+---------------------+-------+
Где day_date
- дата, а timestamp
- дата-время.
Проблема заключается в том, что при использовании date () в предложении on, запрос возвращает только совпадающие записи в обеих таблицах, в то время как он должен получать ВСЕ записи из календаря вместе с любыми совпадающими записями из финансов.
Однако, когда я удаляю функцию date () с момента включения он работает как надо. Любая идея, почему он ведет себя так?
Обновление: я пробовал запрос в dbfiddle здесь: https://www.db-fiddle.com/f/bVvbUy1rirBp5tD9Fq9J8X/0 и кажется, что он работает нормально там. Проблема появляется только в моей среде (MySql v5.7).