1

我已经用尽了我的搜索来寻找这个 MySQL 日期计算的解决方案。我的客户想知道过去一周、一个月和一年完成了多少笔交易。

这是一个基于 SQL 的脚本(但使用 MySQL 语言)我很忙,所以不要打扰 Select、From 等。 datetime_created 字段(在脚本中)已经在 UnixTime 中,而时间戳(现在)被使用计算当前日期减去 7 天。由于公式结果也可能为负,我只需要 0.01 到 7 之间的结果。

下面列出了我过去一周的公式。有任何想法吗?

(registrations.datetime_created -unix_timestamp(now())-604800)/86400
4

4 回答 4

2

在两者之间使用 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 需要扫描整个表以确定要返回的行。

于 2012-04-18T15:30:08.443 回答
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
于 2012-04-18T15:41:25.707 回答
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)) 
于 2012-04-18T15:53:14.767 回答
0

Where 子句根本不被接受,我不得不改变一些逻辑。谢谢大家,但最终的脚本是大家的混合物,如下:

registrations.datetime_created > UNIX_TIMESTAMP(ADDDATE(NOW(),INTERVAL -1 WEEK))
于 2012-04-19T08:04:12.380 回答