【问题标题】:php - mysql select last inserted record between two dates (every month)php - mysql 选择两个日期之间最后插入的记录(每月)
【发布时间】:2017-11-18 18:34:09
【问题描述】:

我有一个表:box (id autoincrement, net_amount, created_at timestamp); 我需要在 php mysql 中创建一个查询来选择每个月最后插入的记录。从而在每个月底获得 net_amount。 我正在尝试这个简单的查询:

select * from box
 where box.created_at < 20055332516028

虽然我的表中的 max created_at 是 2017-10-14 10:42:30,但是当我使用给定查询时没有记录,我需要增加数量来获取记录!!!

【问题讨论】:

  • 所以你必须得到在最后两个日期的几个月内插入的记录,对吗?
  • 我需要获取每个月内最后插入的记录。每个月的开始和结束之间的最后一条记录。
  • 所以你指定start和end的值?我是在价值观之间,对吧?
  • 您不能通过单个查询来完成 - 至少您需要月份列表,而现在您的 tane 中不存在该列表。制作mysql程序,临时表或通过php和一些查询来完成
  • 是的,我已经完成了循环。正如飞行在他的回答中所建议的那样,我认为我仍然需要重新创建开始和结束日期,正如飞行在他的回答中所建议的那样。我使用了 $startDate = date("Y-m-d", strtotime("2016-01-1"));和 $endDate = date("Y-m-d", strtotime("2016-01-1 +" . $i . "month"));然后 $fromTimeStamp = date('d-m-Y', strtotime($fromDate)); $fromTimeStamp = strtotime($fromTimeStamp); $toTimeStamp = date('d-m-Y', strtotime($toDate)); $toTimeStamp = strtotime($toTimeStamp);

标签: mysql sql


【解决方案1】:

20055332516028 不是 Unix 时间戳。您需要获取上个月月底的时间戳,如下所示:

$date = new DateTime();
$date->setDate($date->format('Y'),$date->format('m'),1);
$date->setTime(0,0,0);
$date->sub(new DateInterval('PT1S'));
$endOfMonth = $date->getTimestamp();

然后在查询中使用它:

select * from box where box.created_at < unix_timestamp(?) order by box.created_at desc limit 1

【讨论】:

  • 谢谢你。我认为你是对的,但我仍然需要指定开始日期,对吗?
  • 我正在使用带有 $i 的循环来递增。并使用以下内容在时间戳中创建开始日期和结束日期: $startDate = date("Y-m-d", strtotime("2016-01-1")); $endDate = date("Y-m-d", strtotime("2016-01-1 +" . $i . "month")); $fromTimeStamp = date('d-m-Y', strtotime($fromDate)); $fromTimeStamp = strtotime($fromTimeStamp); $toTimeStamp = date('d-m-Y', strtotime($toDate)); $toTimeStamp = strtotime($toTimeStamp);请问如何在您的解决方案中指定日期?
  • 这实际上取决于您的表中的内容以及您要获取的信息。如果它是“在指定月份插入的最后一条记录”,那么它基本上是“按反向日期对所有记录进行排序,过滤掉指定月份结束后的记录并取第一个”,这就是我提出的查询的目的。跨度>
  • @GaliloGalilo 我通过在查询中添加unix_timestamp() 函数来更新我的答案。这很重要,因为正确处理日期应该涉及时区定义,并且您的数据库将日期存储为时间戳。此外,您可能希望将日期带到同一时区,例如UTC
  • 所以我认为我需要一种方法从开始日期开始并获取月末,然后是下个月末,依此类推直到当前日期。我想我需要改变要求! :( 抱歉。
【解决方案2】:

如果我了解您的问题,您正在寻找这个:-

SELECT b1.*
FROM box b1 LEFT JOIN box b2
ON (b1.name = b2.name AND b1.id < b2.id)
WHERE b1.created_at < PUT YOUR DATE  and b2.id IS NULL;

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2016-09-14
    • 2021-09-14
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    相关资源
    最近更新 更多