【发布时间】:2010-11-11 16:28:51
【问题描述】:
我需要从获取UTC当前时间的结果中找到下一个(分钟可被5整除):00,让我解释一下......
我用的
SELECT UTC_TIMESTAMP()
MySql 中的函数,返回“2010-11-11 16:26:19”。
然后我想将此值转换为“2010-11-11 16:30:00”,最好只使用 MySql,或者 MySql 和 PHP 的组合。
干杯!
【问题讨论】:
我需要从获取UTC当前时间的结果中找到下一个(分钟可被5整除):00,让我解释一下......
我用的
SELECT UTC_TIMESTAMP()
MySql 中的函数,返回“2010-11-11 16:26:19”。
然后我想将此值转换为“2010-11-11 16:30:00”,最好只使用 MySql,或者 MySql 和 PHP 的组合。
干杯!
【问题讨论】:
MsSQL:
DATEADD(second, (60 - DATEPART(second, Last_Updated)) + ((5 - (DATEPART(minute, Last_Updated) % 5)) * 60) - 60, Last_Updated)
MySQL:
SELECT DATE_ADD(UTC_TIMESTAMP(), INTERVAL ((60 - SECOND(UTC_TIMESTAMP())) + ((5 - (MINUTE(UTC_TIMESTAMP()) % 5)) * 60) - 60) SECOND);
将“Last_Updated”替换为您要转换的值,但这会发现从 5:00 到下一个 5 分钟间隔的任何内容。
2010-10-26 18:04:07.000 2010-10-26 18:05:00.000
2010-11-10 17:18:59.000 2010-11-10 17:20:00.000
2010-11-10 20:59:27.000 2010-11-10 21:00:00.000
2010-11-10 20:59:46.000 2010-11-10 21:00:00.000
2010-11-11 12:00:51.000 2010-11-11 12:05:00.000
2010-11-11 12:30:59.000 2010-11-11 12:35:00.000
这些是我最终针对数据库测试的结果。
编辑忘记包含 MySQL 版本,哎呀。还保留了 MsSQL 版本,以防其他人在此过程中感到好奇。
【讨论】:
编辑:我不是 MySQL 用户...我会留下必需品,其他人可能会用它做更多事情。
SELECT UTC_TIMESTAMP() + 300 - UNIX_TIMESTAMP() % 300;
编辑:我只是重写了上面的内容以在 MySQL 中工作:
SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(UTC_TIMESTAMP())
+ 300 - (UNIX_TIMESTAMP(UTC_TIMESTAMP()) % 300));
我不认为这正是 OP 想要的,因为当时间可以被 5 分钟整除时,它也会向上取整 5 分钟。例如,14:45:00 会四舍五入到 14:50:00,这是错误的。但这是朝着正确方向迈出的一步。
【讨论】:
我会将 UNIX_TIMESTAMP() 和 FROM_UNIXTIME() 与 ROUND() 结合使用。
所以最近的 5 分钟边界是:
select now(),from_unixtime(300 * round(unix_timestamp(now())/300));
+---------------------+-------------------------------------------------------+
| now() | from_unixtime(300 * round(unix_timestamp(now())/300)) |
+---------------------+-------------------------------------------------------+
| 2011-04-23 09:20:35 | 2011-04-23 09:20:00 |
+---------------------+-------------------------------------------------------+
使用 unix 时间,您可以在几秒钟内完成工作。最近 10 秒除以 10,四舍五入然后乘以 10。
最近的分钟 - 使用 60 最近的时间 - 使用 3600
你明白了。
【讨论】: