正如标题中所述,我想知道为什么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
答案 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说明符配合使用。