如何在mysql中将奇怪的varchar“time”转换为实时?

时间:2009-11-13 20:33:05

标签: mysql datetime

我有一个时间值作为varchar(4)存储在数据库中,我需要将其转换为实时。

例如,如果时间是“23:59”,我想要在晚上11:59返回。

问题是小时和分钟之间没有“:”。所以当我运行这个查询时

SELECT TIME_FORMAT('2359', '%h:%i');    -- 12:23, wtf??

但是如果我跑了这个:

SELECT TIME_FORMAT('23:59', '%h:%i');   -- returns 11:59 as expected.

所以,总结一下: 1.时间存储为数据库中的varchar(4)。示例:

1200, 1201, 0153, 1364, 1923
  1. 我希望时间以12小时的时间返回,并带有冒号。
  2. 我的大脑受伤了,这比我意识到的要容易得多......

    像这样,但对于mysql Convert varchar into datetime in SQL Server mysql 12 hr to 24 hr time conversion

5 个答案:

答案 0 :(得分:1)

这个查询怎么样?

SELECT TIME_FORMAT(STR_TO_DATE('2359', '%H%i'), '%h:%i %p');

结果如下:

+------------------------------------------------------+
| TIME_FORMAT(STR_TO_DATE('2359', '%H%i'), '%h:%i %p') |
+------------------------------------------------------+
| 11:59 PM                                             | 
+------------------------------------------------------+

答案 1 :(得分:1)

如果包含秒数,它看起来像预期的那样:

mysql> SELECT TIME_FORMAT(235900, '%h %i %s');
+---------------------------------+
| TIME_FORMAT(235900, '%h %i %s') |
+---------------------------------+
| 0000 00 00 11 59 00             |
+---------------------------------+
1 row in set (0.00 sec)

我甚至删除了引号 - 它可以使用整数。

为了确认它正在做正确的事情:

mysql> SELECT TIME_FORMAT(235901, '%h %i %s');
+---------------------------------+
| TIME_FORMAT(235901, '%h %i %s') |
+---------------------------------+
| 11 59 01                        |
+---------------------------------+
1 row in set (0.00 sec)

我尝试了几种组合,如235960 236059 235999,它们都返回NULL。

答案 2 :(得分:1)

没关系,这很好用:

TIME_FORMAT(CONCAT(SUBSTRING(THE_TIME, 1,2), ':', SUBSTRING(THE_TIME, 3,4)), '%h%i')

答案 3 :(得分:1)

使用名为test的表格,其中包含名为string且值为

的列
2300
2100
1200
0430
0430

使用查询

select concat(time_format(concat(substring(string,-4,2),':',substring(string,3)),'%h:%i'),
   case when string >= 1200 then ' PM' else ' AM' end)
from test;

你明白了,

11:00 PM
09:00 PM
12:00 PM
04:30 AM
04:30 AM

答案 4 :(得分:0)

这是一个快速的黑客攻击,但由于你错过了4位数之间的“:”,所以如何插入缺少的冒号。

SELECT TIME_FORMAT( CONCAT( SUBSTRING('2359', 0, 2), ':', 
                            SUBSTRING('2359', 3, 2)), '%h:%i');

当然,请将2359替换为时间列名称。