我已经用尽了我的搜索,正在寻找这个MySQL日期计算的解决方案。我的客户想知道在过去的一周,一个月和一年中完成了多少笔交易。
这是一个基于SQL的脚本(但在MySQL语言中)我很忙,所以不要打扰Select,From等。 datetime_created字段(在脚本中)已经在UnixTime中,而时间戳(现在)用于计算当前日期减去7天。 由于公式结果也可能是负数,我只需要0.01到7之间的结果。
我上周的公式如下所示。有什么想法吗?
(registrations.datetime_created -unix_timestamp(now())-604800)/86400
答案 0 :(得分:1)
如何使用UNIX_TIMESTAMP / ADDDATE()/?
编辑略微扩展以澄清
SELECT
COUNT(*)
FROM registrations
WHERE registrations.datetime_created
-- will go back to now() - a month INCLUDING time. -1 WEEK/MONTH/YEAR etc all works here
BETWEEN UNIX_TIMESTAMP(ADDDATE(NOW(),INTERVAL -1 WEEK))
AND UNIX_TIMESTAMP(NOW())
-- will start at now() including time
通过在WHERE标准中指定开始和结束时间戳,MySQL能够在datetime_created
字段(如果存在)上使用索引来非常有效地执行此操作。相反,如果在WHERE中有WHERE registrations.datetime_created*1235/12515
(字段上的操作),那么您将看到它返回较慢,因为MySQL需要扫描整个表以确定要返回的行。
答案 1 :(得分:1)
这未经过测试,但我认为它会做你想做的事情:
SELECT
q1.dealsInLastWeek,
q2.dealsInLastMonth,
q3.dealsInLastYear
FROM
(SELECT COUNT(*) AS dealsInLastWeek FROM registrations WHERE FROM_UNIXTIME(datetime_created) > DATE_ADD(NOW(), INTERVAL -1 WEEK)) q1,
(SELECT COUNT(*) AS dealsInLastMonth FROM registrations WHERE FROM_UNIXTIME(datetime_created) > DATE_ADD(NOW(), INTERVAL -1 MONTH)) q2,
(SELECT COUNT(*) AS dealsInLastYear FROM registrations WHERE FROM_UNIXTIME(datetime_created) > DATE_ADD(NOW(), INTERVAL -1 YEAR)) q3
答案 2 :(得分:0)
使用INTERVAL进行测试
SELECT (unix_timestamp(now()-INTERVAL '7' DAY)),(unix_timestamp(now()-INTERVAL '1' MONTH)),(unix_timestamp(now()-INTERVAL '1' YEAR));
WHERE registrations.datetime_created>(unix_timestamp(now()-INTERVAL '7' DAY))
答案 3 :(得分:0)
Where子句根本没有被接受,我不得不改变一些逻辑。谢谢所有,但最终的剧本是每个人的混合物,如下:
registrations.datetime_created > UNIX_TIMESTAMP(ADDDATE(NOW(),INTERVAL -1 WEEK))