选择今天、本周、本月的记录 php mysql

Posted

技术标签:

【中文标题】选择今天、本周、本月的记录 php mysql【英文标题】:Select records from today, this week, this month 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"

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

【问题讨论】:

【参考方案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 周前的数据?

以上是关于选择今天、本周、本月的记录 php mysql的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 查询今天昨日本周本月和本季度的所有记录

MySQL查询今天/本周/上周/本月/上个月份的数据

PHP计算今天昨天本周本月上月开始时间和结束时间

mysql查询今天昨天本周本月上一月 今年数据

mysql查询今日本周本月记录

LayUI laydate日期选择器自定义 快捷选中今天昨天 本周本月等等