我有两张桌子,我需要在两个日期字段上加一个(LEFT / RIGHT / INNER)。
transactions
表格有时间戳数据类型。 (通过Adminer的方式,我可以读取"人类格式"的数据,而不是数字,就像你的注释一样。)
另一个calendar
表格有date
数据类型。
我疯狂地尝试cast
/ convert
timestamp
date
JOIN
没有成功。 JOIN
根本不会SELECT *
FROM transactions
RIGHT JOIN calendar ON calendar.day_date = DATE(transactions.dateTransaction)
,就像两个数据类型不同。
transactions
我在calendar
中有2个值,在SELECT *
FROM transactions
LEFT JOIN calendar ON calendar.day_date = DATE(transactions.dateTransaction)
中有100个值,因此我预计有100条记录 - 98条为NULL,2条为填充。
当然,这并没有改变:
DATE
或者,还有双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)
或者:
FROM_UNIXTIME
我只获得了2笔关于交易的记录,我期待~100(日历上有100条)。
或者使用transactions
。
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
表架构:
calendar
CREATE TABLE `calendar`
( `day_date` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
表架构
users_controller.rb
答案 0 :(得分:0)
MYSQL TIMESTAMP与UNIX时间戳不同,它是具有特定附加行为的DATETIME列。您可以读取数据,因为它是一个日期时间值,而不是因为发生了一些魔术转换。现在,如果您的其他列只是DATE数据类型,那么它们将不匹配:DATE<> DATETIME,加入它们意味着将一个类型转换为另一个类型,就像在这些查询中一样。
所以你真正的问题是你建立你的查询的方式:如果你想要所有日历与任何交易,那么:
SELECT *
FROM calendar c
LEFT JOIN transactions t ON c.day_date = DATE(t.dateTransaction)
TIMESTAMP定义:https://dev.mysql.com/doc/refman/5.1/en/datetime.html
DATE()定义:https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date
答案 1 :(得分:0)
我能猜出你问题的唯一方法是:你需要mysql不提供的FULL OUTER JOIN
。
但有一个诀窍: https://stackoverflow.com/a/4796911/4421474
所以我的猜测是:
http://sqlfiddle.com/#!9/9aa42d/4
SELECT `transactions`.*,
`calendar`.*
FROM `transactions`
LEFT JOIN `calendar`
ON `calendar`.`day_date` = DATE(`transactions`.`dateTransaction`)
UNION
SELECT `transactions`.*,
`calendar`.*
FROM `transactions`
RIGHT JOIN `calendar`
ON `calendar`.`day_date` = DATE(`transactions`.`dateTransaction`);