如何从mysql select查询中格式化时间戳以排除hh:mm:ss中不必要的零?

elcex8rz  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(317)

我有一个选择查询:

string checkprogress = "SELECT TIMEDIFF(CURRENT_TIMESTAMP,timestamp) FROM times";

作为回报,我得到了一个不必要的前导零格式。。。

00:01:39 //(hours:minutes:seconds)

如何修改这个查询或修改我的c代码,以便我的字符串排除时间戳中所有不必要的零?
请记住,如果时间超过24小时,字符串将变为:

1.00:01:39 //(day.hours:minutes:seconds)

上面的格式非常好,因为包含了一个日值,所以我要找的格式更改是严格针对日值无效的情况(即时间低于23:59:59的情况)。

e1xvtsh3

e1xvtsh31#

它不漂亮,但很管用。

SET @endDate = '2020-06-27 10:02:00';
SET @startDate = '2020-06-26 12:59:01';
SELECT 
CONCAT(
  IF(FLOOR(TIMESTAMPDIFF(SECOND, @startDate, @endDate) / 86400) > 0,CONCAT(FLOOR(TIMESTAMPDIFF(SECOND, @startDate, @endDate) / 86400), '.'),''),
  LPAD(FLOOR((TIMESTAMPDIFF(SECOND, @startDate, @endDate) % 86400)/3600),2,'0'), ':',
  LPAD(FLOOR((TIMESTAMPDIFF(SECOND, @startDate, @endDate) % 3600)/60),2,'0'), ':',
  LPAD((TIMESTAMPDIFF(SECOND, @startDate, @endDate) % 60),2,'0')
);

结果 21:02:59 ```
SET @endDate = '2020-06-27 10:02:00';
SET @startDate = '2020-06-26 09:59:01';
SELECT
CONCAT(
IF(FLOOR(TIMESTAMPDIFF(SECOND, @startDate, @endDate) / 86400) > 0,CONCAT(FLOOR(TIMESTAMPDIFF(SECOND, @startDate, @endDate) / 86400), '.'),''),
LPAD(FLOOR((TIMESTAMPDIFF(SECOND, @startDate, @endDate) % 86400)/3600),2,'0'), ':',
LPAD(FLOOR((TIMESTAMPDIFF(SECOND, @startDate, @endDate) % 3600)/60),2,'0'), ':',
LPAD((TIMESTAMPDIFF(SECOND, @startDate, @endDate) % 60),2,'0')
)

结果 `1.00:02:59` 
kq0g1dla

kq0g1dla2#

如果您使用的是mysql 8+,那么可以使用 REGEXP_REPLACE :

SELECT REGEXP_REPLACE('00:01:39', '^[0:]+(\\d)', '$1')

对于早期版本,您可以调用 TRIM 两次,第一次修剪 00: 从弦上切下,然后再切下任何一根引线 0 学生:

SELECT TRIM(LEADING '0' FROM TRIM(LEADING '00:' FROM '00:01:39'))

在这两种情况下,输出都是

1:39

有一个警告 TRIM 方法,如果结果可以 00:00:00 输出将是一个空字符串。可以在应用程序中处理,也可以使用 IF 要检查的表达式:

IF(TIMEDIFF(t1, t2) = '00:00:00', 0, TRIM(LEADING '0' FROM TRIM(LEADING '00:' FROM TIMEDIFF(t1, t2))))

在dbfiddle上演示

相关问题