从今天、本周和本月选择记录 PHP MySQL

67

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

筛选今天的记录:where date>(date-(60*60*24))

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

在过去一周内(当前日期往前推7天),筛选出日期大于这个时间点的数据。

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

查询最近30天的数据,即日期大于(date-(60*60*24*30))

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

非常感谢,如果有任何想法,请提出。谢谢!

13个回答

126

假设你的日期列是一个实际的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;

1
所以我将它更改为日期时间格式,什么也没做,现在它可以正常工作了。非常感谢! - Andrew Samuelsen
1
@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....有什么想法吗? - sys_debug
1
这会导致一个浮动的结果集,例如如果你从现在减去1天,那么在凌晨2点和晚上8点相比,结果集将是不同的。 - Kevin Bowersox
3
这只会减去一周,对吗?那么本周怎么办? - C4d
1
我有点困惑:这个到底是显示本周的数据还是最多一周前的数据? - qwertzman
显示剩余5条评论

74

尝试使用日期和时间函数(MONTH(), YEAR(), DAY(),MySQL手册)。

本周:

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

上周:

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

1
它必须在内部进行转换,因为这会导致大型结果集的性能下降。 - Kevin Bowersox
1
如果当前周是第1周会发生什么?它会自动选择上一年的最后一周吗? - Michael Kampmann Rasmussen
这绝对是目前为止最好的答案。 - krummens
3
请将最佳答案更新为: 选择 * FROM jokes WHERE WEEKOFYEAR(date)=WEEKOFYEAR(NOW()) AND YEAR(date) = YEAR(now()); 以排除较旧年份的数据。 - Firas Abd Alrahman
谢谢,伙计。这是最正确的做法。 - Amit Kumar

40

当前月份:

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());

这将仅选择当前月份、真实的一周以及今天确切的日期 :-)


2
非常感谢。当我创建一些自定义排行榜时,这个解决方案对我非常有效。 - Bonxy
1
使用YEARWEEK函数来获取本周的数据,因为如果您的表中有2016年、2017年和2018年的数据在同一周时间内,只使用YEARWEEK函数可以显示2018年的数据。而使用WEEKOFYEAR函数可以显示2016年、2017年和2018年的周数据。 - mattja

9

Nathan的答案会给您提供过去24、168和744小时的笑话,而不是今天、本周或本月的笑话。如果这正是您想要的,那很好,但我认为您可能在寻找其他内容。

使用他的代码,在中午时分,您将得到从昨天中午开始,到今天中午结束的笑话。如果您真的想要今天的笑话,请尝试以下方法:

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

你需要做一些与当前的周、月等略有不同的事情,但你已经明白了这个意思。


4

每个人似乎都将日期视为表格中的一列。
我认为这不是一个好的做法。日期可能只是某些编程语言(比如Oracle)中的关键字,因此请将列名日期更改为JDate。
所以以下方式是否更好:

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

我们有一张名为Jokes的表,其中包含JScore和JDate两列。


3
更好的解决方案是:“今天”是:
SELECT * FROM jokes WHERE DATE(date) = DATE(NOW())

2
尼桑的回答非常接近,但它会返回一个浮动结果集。随着时间的变化,记录将从结果集中漂移出来并进入结果集。在NOW()函数上使用DATE()函数将从日期中去除时间元素,创建一个静态结果集。由于date()函数应用于now()而不是实际的日期列,因此性能应该更高,因为将类似于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;

2
是的,但这仍然不是本周 - 如果一周从星期一开始,并且我们在星期二执行此选择操作,我们将得到上个星期二(上周)的笑话,而不是这个星期一,因为这是正确逻辑下的本周。 - Jaroslav Štreit

1

我认为使用NOW()函数来获取时间差是不正确的。因为通过NOW()函数,每次计算的都是过去24小时的时间差。你必须使用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();
}

0

好的,这个解决方案将帮助您仅选择当前月份、当前周和仅今天。

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记录集为空交易。


1
请解释您的解决方案 - 不要只是发布代码。 - Neil Masson

0

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


1
你的答案可以通过添加附加支持信息进行改进。请[编辑]以添加更多细节,例如引用或文档,以便他人可以确认您的答案的正确性。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接