我有两个不同的表,如下所示,并希望使用两列将它们连接起来 Product
以及 Date
. 这个 Table1
具有yyyymmdd日期格式和 Table2
具有yyyymm格式。在这里 Table2
这是一个月的最后一个工作日。有没有办法把那两张table连接起来。
表1:
Product Date State
A 20080107 NY
A 20080131 TX
B 20100212 CT
B 20100226 MT
C 20150312 HG
C 20140425 UP
表2:
Product Date Country
A 200801 USA
C 201503 AUS
B 201002 UK
B 201704 FIN
C 200605 IRE
A 200805 CAN
输出:
Product Date State Country
A 20080131 TX USA
B 20100226 MT UK
3条答案
按热度按时间m4pnthwp1#
如果我理解正确的话,你想把所有的行都放进去
table1
哪里table1.date
与中月份的最后一个工作日对应table2.date
.我假设这些是真的
date
列,尽管格式不同。如果不是,就把它们转换成真正的约会。table1.date
已经处于可接受的状态YYYYMMDD
格式,以便mysql为您转换它。table2.date
可以更改为可接受的YYYYMMDD
格式concat(date, "01")
. 然后可以使用mysql的日期函数。我强烈建议你通过改变表格使这种转换永久化,这将使一切变得更简单和更快。mysql没有最后一个工作日,但它确实有
last_day
以及dayofweek
(这里是我感叹mysql函数名约定不一致的地方)。为了得到最后一个工作日,我们找到了一个月的最后一天,然后是一周中的哪一天,然后根据需要减去。令人烦恼的是,
dayofweek
星期天返回1,而不是0,这会让事情变得更困难。这最好作为存储过程来完成。这不仅避免了重复,因为我们可以使用变量,它还将逻辑封装在一个整洁的、可测试的函数中。我们也可以申报
deterministic
这意味着mysql可以缓存相同日期的计算,从而节省一些cpu时间。现在我们可以问了
last_business_day('2010-02-01')
然后得到2010-02-26
.有了它,查询就变得简单了。
cwdobuhd2#
以下是您的sql:
示例:
演示
http://www.sqlfiddle.com/#!2011年9月6日
xwmevbvl3#
根据op,
date
存储在INT
. 查找每个月的最后日期(FLOOR(date/100)
)对于表1中的每种产品,使用它与表2合并。演示:sqlfiddle