Olá pessoal, neste artigo vou demostrar algumas funções que o SGBD MySQL nos fornece para manipularmos horas internamente no banco usando SQL. Geralmente efetuamos esse tipo de tratamento internamente na aplicação, independente da linguagem em que esteja sendo desenvolvida a aplicação.

Nesse artigo vou usar o MySQL 5.5.13, sem nenhum tipo de interface gráfica para gerenciamento, vamos acessar o MySQL através do prompt de comando do próprio Windows 7.

Para iniciar o prompt basta clicar em INICAR>EXECUTAR e digitar “cmd” ou vá até acessórios e selecione a opção correspondente.

Iniciando MySQL no prompt basta digitar: “mysql –u <seu_usuário> -p <sua_senha>

Imagem inicial de acesso ao MySQL via prompt

Figura 1: Imagem inicial de acesso ao MySQL via prompt

Função CURTIME() ou CURRENT_TIME()

Vamos começar demonstrando como retornar a data atual do servidor. Podemos usar a função “CURTIME()” ou “CURRENT_TIME()”. Digite no prompt a seguinte instrução:

Listagem 1: Instrução SQL para retornar data atual do servidor


      SELECT CURTIME();
      ou
      SELECT CURRENT_TIME();
      
Hora atual do servidor

Figura 2: Hora atual do servidor

Função TIME_FORMAT()

Essa função tem a finalidade de formatar horas, ela é muito semelhante à função “DATE_FORMAT()” para formatar datas. Podemos usar especificadores de formato tais como: hora, minuto, segundo e microsegundos. Para usá-la temos que passar 2 parâmetros, o primeiro tem que ser o valor da hora que será formatada e o segundo uma string especificando o tipo de formato.

Listagem 2: Função TIME_FORMAT(), passando como parâmetro hora atual e o formato desejado

SELECT CURTIME() AS HORA, TIME_FORMAT(CURTIME(), '%h - %i - %s') AS HORA_FORMATADA;
Hora atual do servidor e hora formatada

Figura 3: Descrição

Notem que nesse exemplo a instrução retornou 2 valores, o primeiro exibe a hora no formato normal e o segundo exibe de acordo com o formato que foi passado como parâmetro.

Observações:o parâmetro “%” é obrigatório antes de informar os caracteres de formato. Abaixo seguem alguns formatos aceitos:

Especificação Descrição
%h Hora (01..12)
%H Hora (00..23)
$i Minutos, numérico (00..59)
%s Segundos (00..59)
%r Tempo, 12 horas (hh:mm:ss seguido por AM ou Pm)
%T Horário, 24 horas (hh:mm:ss)

Função CURRENT_TIMESTAMP()

Essa função retorna a data e hora atual do servidor, geralmente é usada para gravar data e hora de ações (INSERTS, UPDATES E DELETES) em determinada tabela, uma espécie de log.

Listagem 3: Instrução para retornar data e hora atual do servidor.

SELECT CURRENT_TIMESTAMP();
Data e hora atual do servidor e hora formatada

Figura 4: Data e hora atual do servidor e hora formatada

Função TIME()

Podemos usar essa função para extrair somente a hora de um campo do tipo timestamp (‘2012-08-23 20:53:32’). Para esse exemplo vou usar a função CURRENT_TIMESTAMP() para retornar data e hora atual do servidor.

Listagem 4: Instrução para retornar somente hora

SELECT TIME(CURRENT_TIMESTAMP);
Hora atual do servidor, extraída usando a função TIME()

Figura 5: Hora atual do servidor, extraída usando a função TIME()

Função SEC_TO_TIME()

Essa função recebe um parâmetro do tipo inteiro que teoricamente representaria os segundos e retorna um valor convertido em horas, minutos e segundos como um valor do tipo “Time”. Nesse exemplo vou passar o valor 1000 como parâmetro.

Listagem 5: Instrução para conversão de valor em tipo time.

SELECT SEC_TO_TIME(1000);
Valor de retorno da conversão de segundos para time

Figura 6: Valor de retorno da conversão de segundos para time

Função TIME_TO_SEC()

Agora vamos fazer o caminho inverso ao demonstrado na função anterior. Vamos converter um valor do tipo time que será passado com parâmetro para segundos, usando a função “TIME_TO_SEC()”. Para melhor entender essa conversão vou usar o mesmo valor de retorno da função “SEC_TO_TIME()”, “00:16:40”.

Listagem 6: Instrução para conversão de valor em tipo time.

SELECT TIME_TO_SEC('00:16:40');
Valor de retorno da conversão de time para segundos

Figura 7: Valor de retorno da conversão de time para segundos

Função HOUR(), MINUTE() E SECOND()

Usando essas 3 funções podemos fragmentar um valor do tipo time sendo que: HOUR() retorna hora, MINUTE() retorna minuto e SECOND() retorna segundo. Nesse exemplo vou fragmentar em 3 valores (Hora, Minuto e Segundo) um valor do tipo time('12:30:34').

Listagem 7: Instrução para dividir em três valores um valor time

SELECT HOUR('12:30:34') AS HORA, MINUTE('12:30:34') AS MINUTOS, SECOND('12:30:34') AS SEGUNDOS;
Hora dividida em três campos (HORA, MINUTO E SEGUNDO)

Figura 8: Hora dividida em três campos (HORA, MINUTO E SEGUNDO)

Função TIMEDIFF()

Com a função “TIMEDIFF()” podemos encontrar a diferença entre os 2 valores do tipo time que são passados como parâmetro, ou seja, essa função retorna o resultado da subtração entre os parâmetros. Muito semelhante à função “DATEDIFF()” que retorna a diferença entre 2 datas.

Listagem 8: Instrução para retornar a diferença entre dois valores time

SELECT TIMEDIFF('12:35:34', '12:30:46');
Diferença entre os valores passados como parâmetros

Figura 9: Diferença entre os valores passados como parâmetros

Bom pessoal, demonstrei nesse artigo algumas das funções para manipular valores do tipo time que o MySQL oferece. Para o leitor que tiver a curiosidade de conhecer todas ou a maioria, visite o site. Lembrado que esse artigo foi baseado no manual da versão 5.5 do MySQL, em versões anteriores existe a possibilidade de algumas dessas funções não funcionarem.

Sugiro ainda, a quem possa interessar, a leitura deste outro artigo no qual abordei as funções de manipulação de datas no MySQL.

Espero que tenham apreciado e até a próxima.

Caso suja alguma dúvida fiquem à vontade também para usar a seção de comentários.

Abraços a todos!

" target="_blank" title="Curso de MySQL Completo">MySQL oferece. Para o leitor que tiver a curiosidade de conhecer todas ou a maioria, visite o site. Lembrado que esse artigo foi baseado no manual da versão 5.5 do MySQL, em versões anteriores existe a possibilidade de algumas dessas funções não funcionarem.

Sugiro ainda, a quem possa interessar, a leitura deste outro artigo no qual abordei as funções de manipulação de datas no MySQL.

Espero que tenham apreciado e até a próxima.

Caso suja alguma dúvida fiquem à vontade também para usar a seção de comentários.

Abraços a todos!