选择最后一天中7点到午夜时间范围内的所有MySQL记录

时间:2015-08-01 02:22:08

标签: mysql sql datetime

我有这个查询

SELECT * FROM `timeclock_timecard` 
WHERE `clock_in_datetime` > DATE_SUB(CURDATE(), INTERVAL 1 DAY)  

可以在最后一天获得记录,但我需要limit7AM之后创建的记录

请帮忙吗?

3 个答案:

答案 0 :(得分:2)

SELECT * FROM `timeclock_timecard` 
WHERE `clock_in_datetime` > DATE_SUB(CURDATE(), INTERVAL 1 DAY) 
and hour(`clock_in_datetime`) > 7;

添加了一个过滤条件以检查hour

答案 1 :(得分:1)

您的查询几乎是正确的,因为CURDATE()仅提供您可以减去17小时的日期以获得正确的结果。 fiddle

SELECT * FROM `timeclock_timecard` 
WHERE `clock_in_datetime` >= DATE_SUB(CURDATE(), INTERVAL 17 HOUR)

要获取当天的条目,我们可以添加7小时(CURDATE()的时间为0:00)。

SELECT * FROM `timeclock_timecard` 
WHERE `clock_in_datetime` >= DATE_ADD(CURDATE(), INTERVAL 7 HOUR)

答案 2 :(得分:0)

要仅获取昨天的行,时间值为7AM或更晚,我们可以为表达式添加7个小时。

如果我们只到今天的午夜(只是昨天的行),我们可以添加另一个条件,日期时间不到今天的午夜。

例如:

SELECT t.*
  FROM `timeclock_timecard` t
 WHERE t.`clock_in_datetime` >= DATE(NOW()) + INTERVAL -1 DAY + INTERVAL 7 HOUR
   AND t.`clock_in_datetime` <  DATE(NOW())

如果您要排除确切的7:00:00 AM值,请将 >= 更改为 >

关注

问: 我真正想要的是今天早上5-6点和今晚的心灵之夜,所以今天我运行报告的任何时候我都会得到来自用户的时钟数据今天只进入/退出,不包括昨天的数据。

A:谓词的格式为

 WHERE t.`clock_in_datetime` >=  expr1
   AND t.`clock_in_datetime` <   expr2

您只需找到返回相应日期时间值的表达式expr1expr2

只需使用简单的SELECT语句进行测试:

 SELECT DATE(NOW()) + INTERVAL 5 HOUR  AS `start`
      , DATE(NOW()) + INTERVAL 1 DAY   AS `end` 

问: 我还修改了我的选择以考虑我的日期时间是 UTC ,我的结果需要使用<获取今天的记录/ em> 当地时区

 SELECT * , CONVERT_TZ( clock_in_datetime , '+00:00', '-4:00' ) FROM `timeclock_timecard`

A:就个人而言,我会对exprN值进行时区转换,而不是列值。在裸列上使用谓词允许MySQL有效地使用索引;在表达式中包装列会阻止MySQL使用索引。

如果MySQL系统时钟是UTC,并且表中存储的日期时间值位于不同的时区,是的,请使用MySQL CONVERT_TZ函数。

再次,使用一个简单的SELECT语句来开发和测试表达式:

 SELECT CONVERT_TZ( DATE(NOW()) + INTERVAL 5 HOUR, '+0:00', to_tz)   AS `start`
      , CONVERT_TZ( DATE(NOW()) + INTERVAL 1 DAY , '+0:00', to_tz)   AS `end`

to_tz 是表格中值的时区。

一旦表达式startend返回所需的值,然后在时间卡表的查询的谓词中使用这些表达式。