MySQL:时间戳和日期上的连接问题

MySQL:时间戳和日期上的连接问题,mysql,Mysql,我有两个表,需要在两个日期字段上进行(左/右/内)联接 事务表具有时间戳数据类型。(顺便说一句,使用Adminer,我可以读取“人类格式”的数据,而不是数字,正如您注意的那样) 另一个是日历表,它有一个日期数据类型 我想把第一个时间戳转换成日期,但没有成功,我简直疯了。JOIN根本不JOIN,就像两个数据类型不同一样 SELECT * FROM transactions RIGHT JOIN calendar ON calendar.day_date = DATE(transactions.da

我有两个表,需要在两个日期字段上进行(左/右/内)联接

事务
表具有时间戳数据类型。(顺便说一句,使用Adminer,我可以读取“人类格式”的数据,而不是数字,正如您注意的那样)

另一个是
日历
表,它有一个
日期
数据类型

我想把第一个
时间戳
转换成
日期
,但没有成功,我简直疯了。
JOIN
根本不
JOIN
,就像两个数据类型不同一样

SELECT *
FROM transactions
RIGHT JOIN calendar ON calendar.day_date = DATE(transactions.dateTransaction)
我在
事务中有2个值,在
日历中有100个值,所以我希望有100条记录,其中98条为空,2条为填充记录

当然,这在以下方面也不会改变:

SELECT *
FROM transactions
LEFT JOIN calendar ON calendar.day_date = DATE(transactions.dateTransaction)
或者,也可以使用双
日期

SELECT *
FROM transactions
LEFT JOIN calendar ON DATE(calendar.day_date) = DATE(transactions.dateTransaction)
或者:

SELECT *
    FROM calendar c
    RIGHT JOIN transactions t ON c.day_date = DATE(t.dateTransaction)

SELECT *
    FROM calendar c
    LEFT JOIN transactions t ON c.day_date = DATE(t.dateTransaction)
我只得到了交易的2条记录,我期望大约100条(日历上的100条)

或者也可以使用来自\u UNIXTIME的

事务
表架构:

CREATE TABLE `transactions` 
(   `idTransactions` int(11) NOT NULL AUTO_INCREMENT, 
    `dateTransaction` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`idTransactions`),
    KEY `index_dateTransaction` (`dateTransaction`) USING BTREE 
) ENGINE=MyISAM AUTO_INCREMENT=155731 DEFAULT CHARSET=utf8
日历
表架构

CREATE TABLE `calendar` 
(   `day_date` date DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8

MYSQL时间戳与UNIX时间戳不同,它是一个具有特定附加行为的DATETIME列。您可以读取数据,因为它是一个日期时间值,而不是因为发生了一些神奇的转换。现在,如果您的另一列只是一个日期数据类型,那么它们将不匹配:DATE DATETIME,对它们进行连接意味着将其中一列转换为与另一列相同的类型,就像您在这些查询中所做的那样

因此,您真正的问题在于构建查询的方式:如果您希望所有日历都包含任何事务,那么:

SELECT *
    FROM calendar c
    LEFT JOIN transactions t ON c.day_date = DATE(t.dateTransaction)
时间戳定义:


DATE()定义:

MYSQL时间戳与UNIX时间戳不同,它是具有特定附加行为的DATETIME列。您可以读取数据,因为它是一个日期时间值,而不是因为发生了一些神奇的转换。现在,如果您的另一列只是一个日期数据类型,那么它们将不匹配:DATE DATETIME,对它们进行连接意味着将其中一列转换为与另一列相同的类型,就像您在这些查询中所做的那样

因此,您真正的问题在于构建查询的方式:如果您希望所有日历都包含任何事务,那么:

SELECT *
    FROM calendar c
    LEFT JOIN transactions t ON c.day_date = DATE(t.dateTransaction)
时间戳定义:


DATE()定义:

我唯一能猜出您的问题的方法是:您需要
完全外部连接,这不是mysql提供的

但有一个窍门:

所以我的猜测是:


我能猜出你的问题的唯一方法是:你需要
完全外部连接
,这不是mysql提供的

但有一个窍门:

所以我的猜测是:


我会疯狂地将第一个时间戳转换为数据。您的表列类型是什么?先发布架构您是否尝试将calendar.day\u日期强制转换为日期?aka
DATE(calendar.day\u DATE)
这也会有问题。当时间戳字段在特定日期有多条记录时会发生什么情况?它会给你很多records@Alex补充道schemas@JohnRuddell是的,我试过了,但没有成功。在这种情况下,事务上的2条记录在不同的日期。我会疯狂地将第一个时间戳转换为数据。您的表列类型是什么?先发布架构您是否尝试将calendar.day\u日期强制转换为日期?aka
DATE(calendar.day\u DATE)
这也会有问题。当时间戳字段在特定日期有多条记录时会发生什么情况?它会给你很多records@Alex补充道schemas@JohnRuddell是的,我试过了,但没有成功。在这种情况下,交易的2条记录在不同的日期。感谢您的回答,但通过您的查询,我仅从交易中获得2条记录。我缺少日历中的其他98/100。我确实尝试了您的查询。无论是左连接还是右连接,我只得到事务的2条记录。我认为问题在于转换…@Sinerba我认为问题在于数据,发布一些证据,如数据样本或屏幕截图。感谢您的回答,但通过您的查询,我仅从交易中获得2条记录。我缺少日历中的其他98/100。我确实尝试了您的查询。无论是左连接还是右连接,我只得到事务的2条记录。我认为问题在于转换…@Sinerba我认为问题在于数据,发布一些证据,如数据样本或截图。