2016-11-17 60 views
0

SQL语句: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.

+3

请不要使用您未使用的数据库标记此问题。我已经删除了这些标签。请仅添加您正在使用的数据库的标签。 –

+0

不知道我明白你在找什么,但你可以添加一个限制2. – FDavidov

+0

我不想选择事件1,因为它已经发生了。但是上面的声明选择它。 –

回答

0

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

你可能的解决方案是:

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

    建议您删除“更改(或查找谁可以更改)服务器时区”。这只会将问题转移到不在同一时区的其他用户。顺便说一句,这就是为什么在大多数情况下,将UTC日期/时间存储在数据库中是合理的,而不是本地日期/时间。每个人都同意当前的UTC时间... – user1429080

    +0

    已注释和更新。当我不应该做出这样的假设时,我的印象是这是一个个人项目。 – Fritz

    1

    这应该工作:

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

    基本上你比较,如果日期是在未来(明天)或日期今天时间已过。

    如果你的日期在将来,你不关心在这种情况下的时间。

    试试吧。

    +0

    看起来问题是NOW()比两个小时落后。有关如何改变EST时间的想法? –

    +0

    下面是答案:http://stackoverflow.com/questions/13916747/set-mysql-database-timezone-to-gmt – user2693928

    0

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

    +0

    下面是表中的快照:http://i.imgur.com/ulvwRin。 png –

    +0

    我看到第一个time定于8点06分,当时活动在上午7点。如果代码在7:00和8:06之间运行,它也将在当天开始第一个事件。由于SQL语句使用的是NOW()函数,它是在服务器时间执行的函数,因此时区似乎不成问题。这完全取决于服务器的确切时间,以及事件地点和服务器时间之间是否有时间差。 –