选择今天、本周、本月的记录 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的主要内容,如果未能解决你的问题,请参考以下文章