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