как преобразовать странное "время" varchar в реальное время в mysql?

Asked
Viewd9596

2

У меня есть значение времени, которое хранится в базе данных как varchar (4), и мне нужно преобразовать его в реальное время.

Например, если время "23:59", я хочу вернуть 23: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 часов с двоеточием.

у меня болит мозг, и это, пожалуй, намного проще, чем я думаю ...

вот так, но для mysql Преобразование varchar в datetime в SQL Server преобразование времени 12 часов в 24 часа в mysql

  • Что касается вашего первого эксперимента, я полагаю, MySQL интерпретирует '2359' как значение 23 минут и 59 секунд (а 12 - это 12 часов утра, начало дня)..Никогда не замечал этого раньше в MySQL, и у меня нет базы данных, которую можно было бы воспроизвести, так что относитесь к этому с недоверием.

    Arthur Reutenauer13 ноября 2009, 20:43

5 ответов

2

Да ладно, это работает:

 TIME_FORMAT(CONCAT(SUBSTRING(THE_TIME, 1,2), ':', SUBSTRING(THE_TIME, 3,4)), '%h%i')
 
  • Разумно, хотя я не могу решить, яснее ли это, чем мое, или нет.

    wallyk13 ноября 2009, 21:00
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
 
0

Это быстрый прием, но, поскольку между 4-значным числом отсутствует знак ":", как насчет того, чтобы вставить недостающее двоеточие.

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

Конечно, замените 2359 названием столбца времени.

1

А как насчет этого запроса?

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

Вот результат:

+ ------------------------------------------------------ +
|TIME_FORMAT (STR_TO_DATE ('2359', '% H% i'), '% h:% i% p') |
+ ------------------------------------------------------ +
|23:59 |
+ ------------------------------------------------------ +
  • Я отредактировал запрос и заменил% h на% H.Теперь у меня все работает нормально (MySQL 5.1)

    Miroslav Bajtoš13 ноября 2009, 21:12
  • Это возвращает NULL, потому что STR_TO_DATE возвращает NULL.

    wallyk13 ноября 2009, 20:59
1

Похоже, что он работает, как ожидалось, если включить секунды:

mysql> SELECT TIME_FORMAT (235900, '% h% i% s');
+ --------------------------------- +
|TIME_FORMAT (235900, '% h% i% s') |
+ --------------------------------- +
|0000 00 00 11 59 00 |
+ --------------------------------- +
1 ряд в наборе (0,00 сек)

Я даже отбросил кавычки - он отлично работает с целыми числами.

Для подтверждения, что он поступает правильно:

mysql> SELECT TIME_FORMAT (235901, '% h% i% s');
+ --------------------------------- +
|TIME_FORMAT (235901, '% h% i% s') |
+ --------------------------------- +
|11 59 01 |
+ --------------------------------- +
1 ряд в наборе (0,00 сек)

Я пробовал несколько комбинаций, например 235960 236059 235999, и все они возвращают NULL.

  • поле - varchar (4), у меня никогда не будет 235900

    eviljack13 ноября 2009, 20:53