LEFT JOIN работает как INNER при использовании DATE () в условии - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть следующий пример данных, запроса и результата:

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).

1 Ответ

0 голосов
/ 26 апреля 2020

Ваше первое время даты для поля даты '2020-01-02' равно '2020-01-02 00: 00: 00'

Когда вы сравнивая дату с датой и временем, вы получаете сравнение '2020-01-02 00: 00: 00' против '2020-01-02 00: 00: 00' и равно

Но для 4-го

у вас есть '2020-01-04 9: 00: 00' , но дата для сравнения '2020-01-04 00:00:00', потому что дата автоматически добавляет 00:00:00 для сравнения и составляет не равно

, но когда вы делаете дата ('2020-01-04 9:00:00') вы получаете '2020-01-04' , и это снова равно полю даты '2020-01-04'

Таким образом, разница - это часы, которые сравниваются по дате и времени, они имеют отношение к дате, а не

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...