【问题标题】:Select records from today, this week, this month php mysql选择今天、本周、本月的记录 php mysql
【发布时间】:2011-07-14 16:07:52
【问题描述】:

我想这很简单,但无法弄清楚。我正在尝试制作几页——其中包含从我的 mysql 数据库表中选择的今天、本周和本月的结果。使用date('Y-m-d H:i:s'); 创建记录时输入日期。这是我目前所拥有的:

day where date>(date-(60*60*24))

 "SELECT * FROM jokes WHERE date>(date-(60*60*24)) ORDER BY score DESC"

星期在哪里日期>(日期-(60*60*24*7))

 "SELECT * FROM jokes WHERE date>(date-(60*60*24*7)) ORDER BY score DESC"

月(30天)where date>(date-(60*60*24*30))

 "SELECT * FROM jokes WHERE date>(date-(60*60*24*30)) ORDER BY score DESC"

任何想法将不胜感激。谢谢!

【问题讨论】:

    标签: php mysql date select


    【解决方案1】:

    您可以使用单个查询来做同样的事情

    SELECT sum(if(DATE(dDate)=DATE(CURRENT_TIMESTAMP),earning,null)) astodays,
           sum(if(YEARWEEK(dDate)=YEARWEEK(CURRENT_DATE),earning,null)) as weeks, 
           IF((MONTH(dDate) = MONTH(CURRENT_TIMESTAMP()) AND YEAR(dDate) = YEAR(CURRENT_TIMESTAMP())),sum(earning),0) AS months,
           IF(YEAR(dDate) = YEAR(CURRENT_TIMESTAMP()),sum(earning),0) AS years, 
           sum(fAdminFinalEarning) as total_earning FROM `earning`
    

    希望这行得通。

    【讨论】:

      【解决方案2】:

      在 MySQL 中获取上周的数据。即使跨年边界,这也对我有用。

      select * from orders_order where YEARWEEK(my_date_field)= YEARWEEK(DATE_SUB(CURRENT_DATE(), INTERVAL 1 WEEK));
      

      获取本周数据

      select * from orders_order where YEARWEEK(date_sold)= YEARWEEK(CURRENT_DATE());
      

      【讨论】:

        【解决方案3】:

        我认为使用NOW() 函数获取时差是不正确的。因为每次您计算过去 24 小时时,都通过 NOW() 函数。 您必须改用CURDATE()

            function your_function($time, $your_date) {
            if ($time == 'today') {
                $timeSQL = ' Date($your_date)= CURDATE()';
            }
            if ($time == 'week') {
                $timeSQL = ' YEARWEEK($your_date)= YEARWEEK(CURDATE())';
            }
            if ($time == 'month') {
                $timeSQL = ' Year($your_date)=Year(CURDATE()) AND Month(`your_date`)= Month(CURDATE())';
            }
        
            $Sql = "SELECT * FROM jokes WHERE ".$timeSQL
            return $Result = $this->db->query($Sql)->result_array();
        }
        

        【讨论】:

          【解决方案4】:

          “今天”的更好解决方案是:

          SELECT * FROM jokes WHERE DATE(date) = DATE(NOW())
          

          【讨论】:

            【解决方案5】:

            好吧,这个解决方案将帮助您只选择当月、当周和今天

            SELECT * FROM games WHERE games.published_gm = 1 AND YEAR(addedon_gm) = YEAR(NOW()) AND MONTH(addedon_gm) = MONTH(NOW()) AND DAY(addedon_gm) = DAY(NOW()) ORDER BY addedon_gm DESC;
            

            对于每周添加的帖子:

            WEEKOFYEAR(addedon_gm) = WEEKOFYEAR(NOW())
            

            对于每月添加的帖子:

            MONTH(addedon_gm) = MONTH(NOW())
            

            对于每年添加的帖子:

            YEAR(addedon_gm) = YEAR(NOW())
            

            您将获得仅显示今天添加的游戏的准确结果,否则您可能会显示:“今天没有找到新游戏”。使用 ShowIF 记录集是空事务。

            【讨论】:

            • 请解释您的解决方案 - 不要只发布代码。
            【解决方案6】:

            当月:

            SELECT * FROM jokes WHERE YEAR(date) = YEAR(NOW()) AND MONTH(date)=MONTH(NOW());
            

            本周:

            SELECT * FROM jokes WHERE WEEKOFYEAR(date) = WEEKOFYEAR(NOW());
            

            当天:

            SELECT * FROM jokes WHERE YEAR(date) = YEAR(NOW()) AND MONTH(date) = MONTH(NOW()) AND DAY(date) = DAY(NOW());
            

            这将只选择当前月份、真正的一周和真正的今天 :-)

            【讨论】:

            • 非常感谢。在创建一些自定义排行榜时,此解决方案非常适合我。
            • 当前周使用YEARWEEK,因为如果您的表中有 2016 年、2017 年和 2018 年的数据具有相同的星期日期,它将仅显示 2018 年的周数据。使用WEEKOFYEAR,它将显示 2016 年、2017 年和 2018 年的周数据。
            【解决方案7】:

            Nathan 的答案非常接近,但它会返回一个浮动结果集。随着时间的推移,记录将在结果集上浮动。在NOW() 上使用DATE() 函数将从创建静态结果集的日期中删除时间元素。由于date() 函数应用于now() 而不是实际的date 列,因此性能应该更高,因为将date() 之类的函数应用于日期列会抑制MySql 使用索引的能力。

            要保持结果集静态使用:

            SELECT * FROM jokes WHERE date > DATE_SUB(DATE(NOW()), INTERVAL 1 DAY) 
            ORDER BY score DESC;
            
            SELECT * FROM jokes WHERE date > DATE_SUB(DATE(NOW()), INTERVAL 1 WEEK) 
            ORDER BY score DESC;
            
            SELECT * FROM jokes WHERE date > DATE_SUB(DATE(NOW()), INTERVAL 1 MONTH) 
            ORDER BY score DESC;
            

            【讨论】:

            • 是的,但这仍然不是本周 - 如果一周从星期一开始,我们将在星期二执行此选择,我们将得到上星期二(上周)的笑话,而不是这个星期一,因为这是本周的正确逻辑。
            【解决方案8】:

            似乎每个人都认为日期是表格中的一列。
            我不认为这是一个好习惯。日期一词可能只是某些编码语言(可能是 Oracle)中的关键字,因此请将列名日期更改为可能 JDate。
            那么下面的工作会更好吗:

            SELECT * FROM jokes WHERE JDate >= CURRENT_DATE() ORDER BY JScore DESC;
            

            所以我们有一个名为 Jokes 的表,其中包含 JScore 和 JDate 列。

            【讨论】:

              【解决方案9】:

              尝试使用日期和时间函数(MONTH()、YEAR()、DAY()、MySQL Manual

              本周:

              SELECT * FROM jokes WHERE WEEKOFYEAR(date)=WEEKOFYEAR(NOW());
              

              上周:

              SELECT * FROM jokes WHERE WEEKOFYEAR(date)=WEEKOFYEAR(NOW())-1;
              

              【讨论】:

              • 它必须在内部进行强制转换,因为这只会影响大型结果集的性能。
              • 如果当前周是第 1 周会发生什么?是否会自动占用上一年的最后一周?
              • 这是迄今为止最好的答案
              • 最佳答案,请更新为SELECT * FROM笑话 WHERE WEEKOFYEAR(date)=WEEKOFYEAR(NOW()) AND YEAR(date) = YEAR(now());排除较早年份的数据。
              • 谢谢老兄,这是最正确的做法。
              【解决方案10】:

              内森的回答会给你过去 24、168 和 744 小时的笑话,而不是今天、本周、本月的笑话。如果这就是你想要的,那很好,但我认为你可能正在寻找不同的东西。

              使用他的代码,在中午,你会得到昨天中午开始,今天中午结束的笑话。如果你真的想听今天的笑话,试试下面的:

              SELECT * FROM jokes WHERE date >= CURRENT_DATE() ORDER BY score DESC;  
              

              你必须做一些与当前周、月等稍有不同的事情,但你明白了。

              【讨论】:

                【解决方案11】:

                假设您的日期列是实际的 MySQL 日期列:

                SELECT * FROM jokes WHERE date > DATE_SUB(NOW(), INTERVAL 1 DAY) ORDER BY score DESC;        
                SELECT * FROM jokes WHERE date > DATE_SUB(NOW(), INTERVAL 1 WEEK) ORDER BY score DESC;
                SELECT * FROM jokes WHERE date > DATE_SUB(NOW(), INTERVAL 1 MONTH) ORDER BY score DESC;
                

                【讨论】:

                • 所以我将它更改为 datetime 并且没有做任何事情并且它有效。非常感谢!
                • @NathanOstgard 我正在尝试相同的查询一个月...但添加另一个 AND 并且它不起作用...像这样:SELECT id,title,start_date FROM events WHERE start_date > DATE_SUB(NOW (), INTERVAL 1 MONTH) AND city = 'Khobar' ORDER BY start_date DESC....知道为什么吗?
                • 这会不会导致结果集浮动,例如,如果您从现在减去 1 天,与晚上 8 点的结果集相比,凌晨 2 点的结果集将是不同的结果集?
                • 这只会减去 1 周,对吧?本周呢?
                • 我很困惑:这实际上是显示本周还是 MAX 1 周前的数据?
                猜你喜欢
                • 2010-12-25
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-05-18
                • 2023-03-19
                • 1970-01-01
                相关资源
                最近更新 更多