MySQL SEC_TO_TIME给出hh:mm:ss.000000

时间:2014-04-26 11:49:29

标签: mysql

正如标题中所述,我想知道为什么SEC_TO_TIME - MySQL的功能最终给了我Zeros。

参考不应发生的文档(http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_sec-to-time)(我使用的是MySQL 5.0.11)。

任何想法为什么这个零出现以及如何摆脱它们?用于显示毫秒的零。

正弦零不会破坏MySQL的日期功能,它更像是一个“我不喜欢” - 问题而不是真正的问题(至少到现在为止^^)

//编辑:我只是发现零不是来自SEC_TO_TIME,而是来自FROM_UNIXTIME() - 函数。感谢@Abhik Chakraborty要求输入!

// EDIT2:我使用FROM_UNIXTIME(last_try, '%Y-%m-%d %H:%i:%s')来摆脱零。但当我TIME(FROM_UNIXTIME(last_try, '%Y-%m-%d %H:%i:%s'))时,零回复了。为什么?

似乎每个函数都会添加零。在简单的整数值上使用SEC_TO_TIME也会给出零...

这是我使用的整个查询:

SELECT
    SEC_TO_TIME(FLOOR(TIME_TO_SEC((TIME(FROM_UNIXTIME(`last_try`))))/1800)*1800)
FROM `last48h`

查询读取时间戳,只获取时间,将其转换为秒,将秒数分成半小时(/ 1800给出0

3 个答案:

答案 0 :(得分:1)

SEC_TO_TIME为其结果生成TIME数据类型。您可以使用DATE_FORMAT格式化。

如果您确实需要亚秒级时间分辨率,则需要转到5.6.4或更高版本。

当您直接选择要显示的任何类型的TIME数据类型时,您将获得默认的TIME-to-string转换操作。某些MySQL版本中默认的TIME-to-string转换产生一个以hh:mm:ss+zz00结尾的字符串。 +zz00是时区指示符,通常显示为+0000。您有什么机会看到了什么?

尝试使用UNIX_TIMESTAMP()处理SEC_TO_TIME()样式秒数没有意义。截至2014年中期,当前的unix时间戳值高于1.39千兆。 TIME数据类型用于经过时间之类的东西,并且具有不到839小时(3兆秒,精确3020399秒)的限制,并且默默地截断它们的值。

例如,这是对SEC_TO_TIME的好用:

   SELECT SEC_TO_TIME(end_timestamp - start_timestamp) AS duration

修改 奇怪的是,这个查询

SELECT
  SEC_TO_TIME(FLOOR(TIME_TO_SEC((TIME(FROM_UNIXTIME(UNIX_TIMESTAMP()))))/1800)*1800) AS a,
  FLOOR(TIME_TO_SEC((TIME(FROM_UNIXTIME(UNIX_TIMESTAMP()))))/1800)*1800 AS b,
  TIME_TO_SEC((TIME(FROM_UNIXTIME(UNIX_TIMESTAMP()))))/1800 AS c,
  FROM_UNIXTIME(UNIX_TIMESTAMP()) AS d,
  FROM_UNIXTIME(UNIX_TIMESTAMP() - UNIX_TIMESTAMP() % 1800) as e

没有通过我使用的phpmyadmin实例显示任何0000内容。

顺便说一下,大多数人将时间间隔到最近的间隔(在你的情况下为半小时)更喜欢使用模数和减法;它比你的方法更少依赖隐式数值类型转换。

 SELECT TIME(FROM_UNIXTIME(last_try - last_try%1800))

执行问题中的查询。

答案 1 :(得分:0)

我对'SEC_TO_TIME'功能有同样的问题。

我忽略了一个事实,即我将时间戳存储为VARCHAR。

我将我的数据类型从VARCHAR更改为BIGINT,并按预期格式化输出值(hh:mm:ss)。

答案 2 :(得分:0)

尝试将TIME_FORMAT与%k说明符配合使用。