kruchkov-alexandr
@kruchkov-alexandr
VSAT engineer

Конвертация Datetime

Добрый день.
Есть база данных mysql.
Значения create_time, change_time в формате datetime.

image

Выдираю из базы обычным способом

# fetch the result
return if !$Self->{DBObject}->Prepare(
SQL => 'SELECT st.id, st.queue_id, sq.name, st.ticket_state_id, st.ticket_lock_id,'
. ' sp.id, sp.name, st.create_time_unix, st.create_time, sq.group_id, st.tn,'
. ' st.customer_id, st.customer_user_id, st.user_id, st.responsible_user_id, '
. ' st.until_time,'
. ' st.freekey1, st.freetext1, st.freekey2, st.freetext2,'
. ' st.freekey3, st.freetext3, st.freekey4, st.freetext4,'
. ' st.freekey5, st.freetext5, st.freekey6, st.freetext6,'
. ' st.freekey7, st.freetext7, st.freekey8, st.freetext8,'
. ' st.freekey9, st.freetext9, st.freekey10, st.freetext10,'
. ' st.freekey11, st.freetext11, st.freekey12, st.freetext12,'
. ' st.freekey13, st.freetext13, st.freekey14, st.freetext14,'
. ' st.freekey15, st.freetext15, st.freekey16, st.freetext16,'
. ' st.freetime1, st.freetime2, st.freetime3, st.freetime4,'
. ' st.freetime5, st.freetime6,'
. ' st.change_time, st.title, st.escalation_update_time, st.timeout,'
. ' st.type_id, st.service_id, st.sla_id, st.escalation_response_time,'
. ' st.escalation_solution_time, st.escalation_time, st.archive_flag'
. ' FROM ticket st, ticket_priority sp, queue sq'
. ' WHERE sp.id = st.ticket_priority_id AND sq.id = st.queue_id AND st.id = ?',
Bind => [ \$Param{TicketID} ],
Limit => 1,
);

my %Ticket;
while ( my Row = $Self->{DBObject}->FetchrowArray() ) {
$Ticket{TicketID} = $Row[0];
$Ticket{Title} = $Row[55];
$Ticket{QueueID} = $Row[1];
$Ticket{Queue} = $Row[2];
$Ticket{StateID} = $Row[3];
$Ticket{LockID} = $Row[4];
$Ticket{PriorityID} = $Row[5];
$Ticket{Priority} = $Row[6];
$Ticket{CreateTimeUnix} = $Row[7];
$Ticket{Created} = $Self->{TimeObject}->SystemTime2TimeStamp(
SystemTime => $Ticket{CreateTimeUnix},
);
$Ticket{ArchiveFlag} = $Row[64]? 'y': 'n';
$Ticket{Changed} = $Row[54];


Само собой тут не все значения, меня интересует время последнего изменения.

Задача: вывести на веб-странице значение $Changed но в виде «количество дней, минут, секунд с момента последнего изменения».

Для примера: есть уже параметр age(возраст заявки в системе траблшутинга)
Он как-то так выводится:
# fillup runtime values
$Ticket{Age} = $Self->{TimeObject}->SystemTime() — $Ticket{CreateTimeUnix};


И на веб странице я вижу нечто типа «6 дней 11 часов».
  • Вопрос задан
  • 2942 просмотра
Пригласить эксперта
Ответы на вопрос 5
@1x1
нестандартные FetchrowArray и SystemTime2TimeStamp, так что не совсем понятно, как оно у вас устроено. в общем случае DateTime::Format::Flexibleдля парсинга в DateTime и DateTime::Format::Duration для форматирования разницы
Ответ написан
Комментировать
@kovalevsky
В запросе DATE_FORMAT() сделайте для change_time, если я правильно понял.
Ответ написан
Комментировать
raskumandrin
@raskumandrin
Точно ли пользователю нужно в данной задаче видеть секунды?

Я бы воспользовался функцией MySQL TIMEDIFF(), вытащив из результата уже средствами перла число дней и разобрав остаток на часы и минуты, чтобы не тащить перл-модули арифметики дат в проект.
Ответ написан
@pcdesign
количество дней, минут, секунд с момента последнего изменения


Ну можно, вот так например:

#!/usr/bin/env perl -w 

print convert_time(100500);


sub convert_time {
  my $time = shift;
  my $days = int($time / 86400);
  $time -= ($days * 86400);
  my $hours = int($time / 3600);
  $time -= ($hours * 3600);
  my $minutes = int($time / 60);
  my $seconds = $time % 60;

  $days = $days < 1 ? '' : $days .'день ';
  $hours = $hours < 1 ? '' : $hours .'час. ';
  $minutes = $minutes < 1 ? '' : $minutes . 'мин ';
  $time = $days . $hours . $minutes . $seconds . 'сек';
  return $time;
}



Получаем: 1день 3час. 55мин 0сек
Ответ написан
Комментировать
@kirichenko
perldoc -f localtime
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы