繁体   English   中英

在条件下使用 DATE() 时,LEFT JOIN 像 INNER 一样工作

[英]LEFT JOIN is working like INNER when using DATE() in condition

我有以下示例数据、查询和结果:

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是日期时间。

问题是当我在 on 子句中使用 date() 时,查询只返回两个表中的匹配记录,而它应该从日历中获取所有记录,以及财务中的任何匹配记录。

但是,当我从 on 子句中删除 date() function 时,它可以正常工作。 知道为什么它会这样吗?

更新:我在这里尝试了 dbfiddle 中的查询: https://www.db-fiddle.com/f/bVvbUy1rirBp5tD9Fq9J8X/0似乎在那里工作正常。 该问题仅出现在我的环境中(MySql v5.7)。

日期字段“2020-01-02”的第一个日期时间是“2020-01-02 00:00:00”

当您将日期与日期时间进行比较时,您会得到“2020-01-02 00:00:00”“2020-01-02 00:00:00”的比较,这是相等

但是对于第四

您有“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”

所以区别在于日期时间比较的小时数,它们与日期不相关

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM