我在MySQL数据库中有两个String列。这两个列是通过以下方式从Java程序填充的:
System.currentTimeMillis(); //first column
System.currentTimeMillis(); + someStringHours //second column; the String, someStringDays reprensents some number of days, let's say 5 hours in millis...
MySQL中的哪个函数可用于计算差异以获得这两列之间的小时数?
答案 0 :(得分:1)
您称它们为string dates
,但实际上它们是UNIX时间戳(以毫秒为单位)(也称为Javascript时间戳)。这就是System.currentTimeMillis()生成的。它是Java long
数据项和MySQL BIGINT
数据项。您可以将其存储在字符串中。 (如果需要,您可以以这种方式存储它,但是搜索和排序存储为字符串的数字是一种不可靠的混乱;请注意!)
典型的Javascript时间戳(或UNIX时间戳,以毫秒为单位)是一个大整数,例如1600858176374456
。 1 600 858 176 374 456
。
您可以像这样使用FROM_UNIXTIME()将这样的时间戳转换为MySQL TIMESTAMP值
FROM_UNIXTIME(column * 0.001)
为什么将列值乘以0.001(即除以1000)?因为FROM_UNIXTIME()以秒为单位获取时间戳,而System.currentTmeMillis()
以毫秒为单位生成时间戳。
然后您可以像这样使用DATEDIFF()
DATEDIFF(FROM_UNIXTIME(laterTs*0.001),FROM_UNIXTIME(earlierTs*0.001))
这给出了整数天。
如果您需要以其他单位表示的时差,例如小时,分钟或日历季度,则可以使用TIMESTAMPDIFF()
。这样您可以节省数小时。
TIMESTAMPDIFF(HOUR,
FROM_UNIXTIME(laterTs*0.001),
FROM_UNIXTIME(earlierTs*0.001));
您可以使用SECOND
,MINUTE
,HOUR
,DAY
,WEEK
,MONTH
,QUARTER
或{ {1}}作为此功能中的时间单位。
专业提示:如果可以,请使用DBMS的日期算术函数。他们已经为您解决了各种情况。
而且,顺便说一句,如果您这样声明列(Timestamp with a millisecond precision: How to save them in MySQL):
YEAR
通过这些时间,您可以更轻松地建立索引并进行搜索。
答案 1 :(得分:0)
SELECT (1600858176374-1600944576374)/(24*60*60*1000) as Days
其中(1600858176374-1600944576374)是时间戳记,而(24 60 60 * 1000)是一天中的磨坊