【问题标题】:SQL Finding upcoming date and timeSQL 查找即将到来的日期和时间
【发布时间】:2017-04-01 01:45:20
【问题描述】:

SQL语句:

SELECT * FROM table 
WHERE eventdate >= DATE(NOW()) 
AND eventtime > TIME(NOW()) 
ORDER BY eventdate ASC, eventtime ASC;

目标是选择接下来要发生的事件。只要在同一日期没有两个事件,它就可以正常工作。例如:

Event 1, 11/17/2016 7:00am
Event 2, 11/17/2016 2:00pm
Event 3, 11/18/2016 9:00am

我想选择事件 2,因为它已在 17 日上午 7:00 通过。上面的语句仍然会选择事件 1。

【问题讨论】:

  • 请不要用您不使用的数据库标记这个问题。我已经删除了这些标签。请仅添加您正在使用的数据库的标签。
  • 不确定我是否理解您要查找的内容,但您可以添加 LIMIT 2。
  • 我不想选择事件 1,因为它已经发生了。但是上面的语句是选择它。
  • 数据库中的列是 DATE 和 TIME 类型,还是您将日期存储在 VARCHAR 或其他同样无用的地方
  • 它们是类型日期和时间。

标签: sql


【解决方案1】:

这应该可行:

SELECT * FROM table 
WHERE eventdate > DATE(NOW())
OR
    (eventdate = DATE(NOW()) AND eventtime > TIME(NOW()) )

ORDER BY eventdate ASC, eventtime ASC;

基本上你比较日期是在未来(明天)还是日期是今天并且时间已经过去了。

如果你的日期是在未来,那么在这种情况下你不需要关心时间。

试试看。

【讨论】:

【解决方案2】:

在 cmets 中确定,问题在于数据库所在服务器当前使用的时区。正因为如此,而且您使用的是 PHPmyAdmin,我相信您没有权限更改服务器时区。

您可能的解决方案是:

  • 使用已在 MST (UTC-07) 或服务器所在时区的数据
  • 使用当前数据减去 2 小时或convert the data to a time zone
  • 重写查询以使用 NOW() + 2 hours

【讨论】:

  • 建议您删除“更改(或查找谁可以更改)服务器时区”。这只会将问题转移到不在同一时区的其他用户。顺便说一句,这就是为什么在大多数情况下将 UTC 日期/时间存储在数据库中而不是本地日期/时间是有意义的。每个人都同意当前的 UTC 时间...
  • 已记录并更新。我的回答是,我不应该做出这样的假设,这是一个个人项目。
【解决方案3】:

在您的示例的上下文中,我需要eventdateeventtime fields 中存储的值。因为如果你检查time > TIME(NOW()),如果时间过去了,它不应该选择这个事件。

【讨论】:

  • 我看到第一个 time 设置为 8:06,而事件发生在上午 7:00。如果代码在 7:00 到 8:06 之间运行,它也将占用当天的第一个事件。时区似乎不是问题,因为 SQL 语句正在使用 NOW() 函数,该函数是在服务器时间执行的函数。这一切都取决于服务器的确切时间以及事件地点和服务器时间之间是否存在任何时间差异。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
相关资源
最近更新 更多