将MySQL日期四舍五入到最接近的时间间隔,而不受夏时制更改的影响

时间:2018-12-04 00:17:54

标签: mysql datetime unix-timestamp timestamp-with-timezone

SET @time := '2018-11-08 00:36:50.000000';
SET @intervalInMinutes := 15
SELECT FROM_UNIXTIME((Select FLOOR ((select UNIX_TIMESTAMP(@time) / (@intervalInMinutes* 60))) * (@intervalInMinutes*60)));

我需要在MySQL中编写一个查询,该查询将日期/时间转换为用户指定的最近间隔类别。 例子:

  • 例如1:'2018-10-24 17:45:50.000000'

    1. 间隔15分钟将转换为'2018-10-24 17:45:00'
    2. 间隔30分钟将转换为'2018-10-24 17:30:00'
    3. 间隔60分钟将转换为'2018-10-24 17:00:00'
  • 例如2:'2018-10-24 17:36:20.000000';

    1. 间隔15分钟将转换为'2018-10-24 17:30:00'
    2. 间隔30分钟将转换为'2018-10-24 17:30:00'
    3. 间隔60分钟将转换为'2018-10-24 17:00:00'

我已经编写了上面的查询,看起来不错。但是,转到this post时,第一个答案有一条注释,指出该方法将使介于夏时制之间的日期时间失败。我没有他指定的例子。对于我的情况,我在该线程上注意到的其他方法看起来更加复杂。我试图了解这将如何影响我的情况。感谢任何建议/示例。或者,有没有更好的方法通过编写更简单的查询来避免这种情况? 附言我希望这适用于MySQL 5.6、5.7和8.0。

1 个答案:

答案 0 :(得分:0)

在将日期时间转换为unixtime并返回时,您可能会遇到的问题explained in MySQL database非常好。

为了安全起见,我将使用另一种方法:

for x in range(100,1000):
    #Get the digits from the number generated as a, b, c
    a = x//100
    b = (x%100)//10
    c = x%10
    #now check whether the number is armstrong number or not
    #here, a**3 + b**3 + c**3 == abc
    if((a**3) + (b**3) + (c**3) == x):
        print("Armstrong Number {}".format(x))

这个想法非常相似:您将时间转换为秒,四舍五入并转换回来。