【问题标题】:Get date closest to today in PHP from database从数据库中获取最接近今天的 PHP 日期
【发布时间】:2011-04-18 14:19:51
【问题描述】:

更新

我正在做一个网站的后端。该网站的重点是向访问者提供一个清晰的概览,我们正在组织什么时间和什么活动。
所以我用各种活动填满了数据库。每个活动都有日期、名称和其他一些信息。

很明显,展示过去的活动对访客没有帮助,所以我只想让他们展示即将到来的活动。为了节省自己的大量工作,最好做 PHP/MySQL 的所有工作并只向访问者显示接下来的 2 个事件。

你能告诉我一个 MySQL 函数来做到这一点吗?

提前致谢,

【问题讨论】:

  • 呃。 PHP 无法直接访问您的数据库。这意味着您不使用 PHP 函数从 MySQL 获取内容。你能多考虑一下并改写一下吗?
  • 当您说最接近今天时,您是指今天之前的活动,今天之后的活动(假设您将来有活动),还是两者兼而有之?
  • @Alin Purcaru:是的,我的错。我当然是指 MySQL。我对PHP不太熟练,所以我只是想知道。你明白我想要完成的事情吗?还是您需要更多信息?
  • @d.syph.3r 我的意思是今天之前的活动。该数据库充满了过去和未来的活动。过去的仅供我们参考,未来的仅供参观者参考。所以我只想在未来显示那些。
  • @Alin Purcaru 我没有足够的信息来确定您想要什么。我只能猜测。您应该编辑问题并添加更多详细信息。

标签: php mysql date getdate


【解决方案1】:

只是一些建议:

选择当前时刻之前最近的2个事件和当前时刻之后最近的2个事件。

(SELECT *
FROM ...
WHERE `time` < NOW()
ORDER BY `time` DESC
LIMIT 2)
UNION
(SELECT *
FROM ...
WHERE `time` > NOW()
ORDER BY `time` ASC
LIMIT 2)

此时,您将在 PHP 中最多拥有 4 个事件。但是您只需要 2. 最接近的 2. 要找出最接近的您使用 strtotime 并检查事件的时间戳与您可以通过调用 time() 获得的当前时间戳之间的差异。之后,您只保留 2 个最接近的事件。

请注意,这可以直接从 MySQL 中实现,但这种方式更难。


@最新更新。如果您不想了解更多,阅读此内容就足够了。

只需使用此查询:

SELECT *
FROM ...
WHERE `time` > NOW()
ORDER BY `time` ASC
LIMIT 2

【讨论】:

  • 这个成功了!非常感谢。如果我有 2,000 项活动,这在性能方面是不是很好?
  • 在 2000 年,这并不重要。但为了安全起见,请在 time 列上添加索引。
  • 会的:)谢谢! (为什么与 2000 无关。当有 5 个这样的情况时是否有关系?)
  • @Michiel 我的意思是这无关紧要,因为 2000 并不是一个很大的数字。
  • 我认为你可以在这种情况下使用 UNION ALL,你应该这样做,因为它更有效。
【解决方案2】:

您可以使用DATEDIFFABS...

SELECT * FROM `activities` ORDER BY ABS(DATEDIFF(NOW(), `date`)) LIMIT 2

根据更新后的问题,只考虑未来的活动......所以......

SELECT * FROM `activities` WHERE `date` > NOW() ORDER BY `date` LIMIT 2

【讨论】:

  • 快速解决方案。但是如果事件太多,性能会很差。你不能在这样的表达式上添加索引,但你可以在时间列上添加它。
【解决方案3】:
$query = 'SELECT .... FROM ... WHERE `date` > '.$today.' ORDER BY `date` DESC LIMIT 2';

$today 取决于您的 date 列类型。

【讨论】:

  • 将 PHP 的 $today 更改为 MySQL 的 NOW() 将停止 SQL 注入,并且无论“日期”列类型如何,仍然始终提供相关信息。
  • 仅当“今天”在今天是真实的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 2016-03-28
  • 2021-07-30
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 2014-05-04
相关资源
最近更新 更多