Отображение MySql TIMEDIFF() в сетке БД

Когда я использую командную строку, этот запрос дает мне приятные результаты (он показывает дуальность, о чем и говорит TIMEDIFF):

mysql> select timediff(end_time_stamp,start_time_stamp) from test_runs;
+-------------------------------------------+
| timediff(end_time_stamp,start_time_stamp) |
+-------------------------------------------+
| 00:00:07                                  |
| 00:00:11                                  |
| 00:01:23                                  |
+-------------------------------------------+
3 rows in set (0.00 sec)

Когда я помещаю его в сетку БД в Delphi, TIMEDIFF форматируются как 12:00:07 AM, что мне не нужно (это выглядит как время, а не продолжительность).

Я использую AnyDac, и когда я открываю редактор запросов во время разработки и выполняю его, результат также 12:00:07 AM, поэтому кажется, что AnyDac по какой-то причине его форматирует.

Как я могу получить вывод, например, 00:00:07 (длительность, а не время)?

  • Могу ли я настроить запрос AnyDac?
  • Могу ли я явно отформатировать вывод с помощью инструкции MySql?
  • Есть ли функция OnXXX(), которую я могу преобразовать в код (и как)?

[Обновление] Ну, этот уродливый кусок кода делает то, что я хочу, но есть ли более элегантный способ?

SELECT run_id,
       start_time_stamp,
       end_time_stamp,
       CONCAT(CONCAT(CONCAT(CONCAT(LPAD(EXTRACT(HOUR FROM timediff(end_time_stamp,start_time_stamp)), 2, '0'), ":"),LPAD(EXTRACT(MINUTE FROM timediff(end_time_stamp,start_time_stamp)), 2, '0'), ":"), LPAD(EXTRACT(SECOND FROM timediff(end_time_stamp,start_time_stamp)), 2, '0'))) AS duration,
       description

FROM test_runs ORDER BY start_time_stamp DESC

person Mawg says reinstate Monica    schedule 07.03.2013    source источник


Ответы (1)


Используйте свойство DisplayFormat объекта TField, чтобы получить результат, который вы хотите, например:

begin
  MyQuery.Open;
  MyQueryField.DisplayFormat := 'hh:nn:ss';
  //or casting a TField to a descendant, like this:
  (MyQuery.FieldByName('duration') as TDateTimeField).DisplayFormat := 'hh:nn:ss';
end;

Редактировать

Я добавил приведение к TDateTimeField. Если ваше фактическое поле не является экземпляром TDateTimeField или потомком, это приведет к исключению EInvalidTypeCast, поскольку вы должны привести его к правильному классу, которому оно принадлежит.

person jachguate    schedule 07.03.2013
comment
Извините, кажется, я слишком туп, чтобы понять ваш ответ. Это самое близкое, что я мог получить ` TestRunsOverviewADQuery.FieldByName('duration').DisplayFormat := 'hh:nn:ss';` и он не компилируется. - person Mawg says reinstate Monica; 07.03.2013
comment
@Mawg не компилируется - это плохое описание того, что говорит вам компилятор. Что за сообщение об ошибке? - person jachguate; 07.03.2013
comment
[Ошибка DCC] fMainForm.pas(711): E2003 Необъявленный идентификатор: 'DisplayFormat' - person Mawg says reinstate Monica; 07.03.2013
comment
@Mawg: это потому, что FieldByName возвращает TField, а DisplayFormat представлен в одном из его потомков. Вам нужно будет привести его к фактическому типу экземпляра поля. - person Marjan Venema; 07.03.2013
comment
@MarjanVenema +1 Не могли бы вы рассказать мне, как это сделать? - person Mawg says reinstate Monica; 07.03.2013
comment
@Mawg: хм, для правильного ответа потребуется просмотреть больше кода, чем показывает ваш вопрос. Поскольку вы, похоже, не используете постоянные поля: проверьте модуль db. Найдите TField, найдите его потомков, выясните, где появился DisplayFormat. Используйте мягкое as приведение (FieldByName() as TSomeTypeOfField).DisplayFormat и quard против исключения EInvalidCast. - person Marjan Venema; 07.03.2013