【问题标题】:php - SQL week of year() to string/datephp - 一年中的 SQL 周()到字符串/日期
【发布时间】:2011-12-31 00:27:43
【问题描述】:

我对 MySQL 数据库运行查询以获取按周分组的总访问次数。 表结构为:

|ID (int) | SESSION (char) | TIMESTAMP (datetime) |

我的查询如下所示: 'SELECT COUNT(session), WEEKOFYEAR(timestamp) FROM stats GROUP BY WEEKOFYEAR(timestamp) ORDER BY timestamp ASC';

所以我得到了一组周数,例如 40、41、45 等,以及观看次数。

如何将其转换为可读日期(使用 PHP)?说“第 40 周左右:2000 次访问”是不切实际的。

我正在寻找 StartDate-EndDate/Month/Year 形式的东西,例如。第 5-11/12/2011 周,访问:XXXX。

您以前可能使用过哪些功能?我试过但没有运气。

我的 SQL 查询是正确的方法吗?假设我正在正确查询数据库以了解我想要完成的事情,有没有办法将周数转换为日期/日期跨度?

我也想知道如果一个星期跨越两个月甚至两年会发生什么。

【问题讨论】:

  • -1,我认为这没有任何意义。据我了解,要在 mysql 中返回星期几,数据源也需要是日期。所以,你错过了一大块关键信息。你应该再次修改你的问题。
  • @ajreal 现在好点了吗?我不确定还包括什么。我认为它应该有点普遍。也许是我想的不对?
  • 是的,没有那条信息(模式)几乎不可能理解您的问题。好的,回到你的问题,因为你的来源是时间戳(这意味着你可以返回任何格式)但是你正在使用 GROUP BY。 (聚合函数)。我认为这是不可能的......或者您可以添加更多输入示例和您想要的输出。
  • 添加一些示例数据和基于该示例数据的预期数据输出。在您的示例中Week 5-11/12/2011 - 2011 年 11 月 12 日是最短日期吗?最大?你是怎么得出的?

标签: mysql date php


【解决方案1】:

假设:

  • 您要显示的日期是该周的星期一星期日期
  • 你的主要输出是Week <week number>-<monday date of week>, Visits: <count>.
  • 你知道足够多的PHP能够拉列Phrase

以下 SQL 命令应为您显示一年中每周的会话数、一年中的一周以及您想要的短语:

SELECT COUNT(session) AS VisitCount
    , WEEKOFYEAR(timestamp) AS WeekOfYear_Value
    , MAKEDATE(
        CASE 
            WHEN WEEKOFYEAR(timestamp) = 52 
                THEN YEAR(timestamp)-1 
            ELSE YEAR(timestamp) 
        END, (WEEKOFYEAR(timestamp) * 7)-4) AS DateOfWeek_Value
    , CONCAT('Week ', WEEKOFYEAR(timestamp)
        , '-', MAKEDATE(
            CASE 
                WHEN WEEKOFYEAR(timestamp) = 52 
                    THEN YEAR(timestamp)-1 
                ELSE YEAR(timestamp) 
            END, (WEEKOFYEAR(timestamp) * 7)-4) -- Monday
        , ', Visits: ' , COUNT(session), '.') AS Phrase
FROM stats
GROUP BY WEEKOFYEAR(timestamp)
ORDER BY timestamp ASC

在您现有的数据上尝试一下。

[编辑:附加代码更改]

为了给你周日的输出:

SELECT COUNT(session) AS VisitCount
    , WEEKOFYEAR(timestamp) AS WeekOfYear_Value
    , CONCAT('Week ', WEEKOFYEAR(timestamp)
        , '-', MAKEDATE(
            CASE 
                WHEN WEEKOFYEAR(timestamp) = 52 
                    THEN YEAR(timestamp)-1 
                ELSE YEAR(timestamp) 
            END, 
            CASE 
                WHEN WEEKOFYEAR(timestamp) = 52 
                    THEN (WEEKOFYEAR(timestamp) * 7)+3
                ELSE (WEEKOFYEAR(timestamp) * 7)+2
            END
            )
    , ', Visits: ' , COUNT(session), '.') AS Phrase
FROM stats
GROUP BY WEEKOFYEAR(timestamp)
ORDER BY timestamp ASC

另请注意,最近一次更新在makedate 命令中包含另一个CASE,以确保当前值和去年值的日期之间的一致性。

【讨论】:

  • 工作就像一个魅力!是的,从那时起,我知道如何获取和展示我需要的东西。非常感谢匿名。
  • 太棒了!只是要注意; case 语句是这样的,如果一年中的第 52 周,我们确保 makedate 命令使用上一年而不是当前年份来避免一周 2011-01-01 指向一年中的一周 2011-12-26 .另外,我用-4 指向星期一,认为这可能是宣布星期的方式。
  • 我怎样才能得到最后一天,而不是每周的第一天?因为我在一个连续的 XY 图上可视化了数据(X 是日期-星期一,Y 是访问),所以该图似乎有点偏离。例如,对于以下值:第 1-7 周->1000、第 7-14 周->1500、第 14-21 周->500 周,创建以下点 a(1, 1000), b(1, 1500) , c(1, 500)。如果您将它们连接起来,似乎访问量实际上在第二周下降而不是上升!所以我需要总结前 7 天的访问量,而不是一周的第一天,并将它们与一周的最后一天关联起来!
  • 我已经更新了我的帖子以包括周日的输出 :) 希望这个可以解决问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-07
  • 2019-07-15
  • 1970-01-01
  • 2012-01-24
相关资源
最近更新 更多