MySQL:JOIN ON时间戳和日期问题

时间:2015-10-20 17:24:34

标签: mysql

我有两张桌子,我需要在两个日期字段上加一个(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

2 个答案:

答案 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`);