Calculando minutos ou segundos de um horário – SQL – Firebird
Queridos amigos da comunidade Show Delphi, tudo beleza?
Hoje vamos ver como contar os minutos ou segundos de um horário via SQL no Firdbird a partir de sua versão 3.0.
Primeiramente criei uma função interna para calcular os minutos de um horário,
com opção de truncar ou não.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| SET TERM ^ ;
CREATE OR ALTER FUNCTION MINUTES_OF_TIME (
IN_TIME TIME,
IN_TRUNC BOOLEAN)
RETURNS DOUBLE PRECISION
AS
DECLARE variable VRESULT DOUBLE PRECISION;
BEGIN
/* Criado por Giovani Da Cruz */
VRESULT = EXTRACT(HOUR FROM :in_time) * 60;
vresult = :vresult + EXTRACT(MINUTE FROM :in_time);
IF (:in_trunc) THEN
BEGIN
RETURN vresult;
END
BEGIN
vresult = :vresult + EXTRACT(SECOND FROM :in_time) / 60.00;
RETURN vresult;
END
END
^
SET TERM ; ^ |
SET TERM ^ ;
CREATE OR ALTER function MINUTES_OF_TIME (
IN_TIME time,
IN_TRUNC boolean)
returns double precision
as
declare variable VRESULT double precision;
begin
/* Criado por Giovani Da Cruz */
VRESULT = extract(hour from :in_time) * 60;
vresult = :vresult + extract(minute from :in_time);
if (:in_trunc) then
begin
return vresult;
end
begin
vresult = :vresult + extract(second from :in_time) / 60.00;
return vresult;
end
end
^
SET TERM ; ^
Também já criei outra função interna para calcular os segundos de um horário.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| SET TERM ^ ;
CREATE OR ALTER FUNCTION SECONDS_OF_TIME (
IN_TIME TIME)
RETURNS BIGINT
AS
DECLARE variable VRESULT DOUBLE PRECISION;
BEGIN
/* Criado por Giovani Da Cruz */
-- calculando as horas em minutos
vresult = EXTRACT(HOUR FROM :in_time) * 60;
-- adicionando os minutos avulsos
vresult = :vresult + EXTRACT(MINUTE FROM :in_time);
-- transformando em segundos
vresult = :vresult * 60;
-- adicionando os segundos avulsos
vresult = :vresult + EXTRACT(SECOND FROM :in_time);
RETURN vresult;
END
^
SET TERM ; ^ |
SET TERM ^ ;
CREATE OR ALTER function SECONDS_OF_TIME (
IN_TIME time)
returns bigint
as
declare variable VRESULT double precision;
begin
/* Criado por Giovani Da Cruz */
-- calculando as horas em minutos
vresult = extract(hour from :in_time) * 60;
-- adicionando os minutos avulsos
vresult = :vresult + extract(minute from :in_time);
-- transformando em segundos
vresult = :vresult * 60;
-- adicionando os segundos avulsos
vresult = :vresult + extract(second from :in_time);
return vresult;
end
^
SET TERM ; ^
Para testes pessoal, criei esta tabela
1
2
3
4
5
6
7
| CREATE TABLE TESTE (
CODIGO INTEGER NOT NULL,
TEMPO_INICIO TIME NOT NULL,
TEMPO_FIM TIME NOT NULL
);
ALTER TABLE TESTE ADD CONSTRAINT PK_TESTE PRIMARY KEY (CODIGO); |
CREATE TABLE TESTE (
CODIGO INTEGER NOT NULL,
TEMPO_INICIO TIME NOT NULL,
TEMPO_FIM TIME NOT NULL
);
ALTER TABLE TESTE ADD CONSTRAINT PK_TESTE PRIMARY KEY (CODIGO);
1
2
3
4
5
6
7
8
9
| Também vou disponibilizar um script para que você possa preencher a tabela com dados que utilizei no vídeo.
INSERT INTO TESTE (CODIGO, TEMPO_INICIO, TEMPO_FIM)
VALUES (1, '00:00:00', '02:30:00');
INSERT INTO TESTE (CODIGO, TEMPO_INICIO, TEMPO_FIM)
VALUES (2, '01:17:37', '10:46:48');
INSERT INTO TESTE (CODIGO, TEMPO_INICIO, TEMPO_FIM)
VALUES (3, '02:30:00', '21:00:10');
INSERT INTO TESTE (CODIGO, TEMPO_INICIO, TEMPO_FIM)
VALUES (4, '00:30:00', '02:30:00'); |
Também vou disponibilizar um script para que você possa preencher a tabela com dados que utilizei no vídeo.
INSERT INTO TESTE (CODIGO, TEMPO_INICIO, TEMPO_FIM)
VALUES (1, '00:00:00', '02:30:00');
INSERT INTO TESTE (CODIGO, TEMPO_INICIO, TEMPO_FIM)
VALUES (2, '01:17:37', '10:46:48');
INSERT INTO TESTE (CODIGO, TEMPO_INICIO, TEMPO_FIM)
VALUES (3, '02:30:00', '21:00:10');
INSERT INTO TESTE (CODIGO, TEMPO_INICIO, TEMPO_FIM)
VALUES (4, '00:30:00', '02:30:00');
Por fim, consigo obter os minutos e segundos de um campo time usando as funções, veja o exemplo:
1
2
3
4
5
6
| SELECT
I.tempo_inicio,
minutes_of_time(I.tempo_inicio, TRUE) AS MINUTOS_TRUNC,
minutes_of_time(I.tempo_inicio, FALSE) AS MINUTOS_REAL,
seconds_of_time(I.tempo_inicio) AS SEGUNDOS
FROM teste i |
select
I.tempo_inicio,
minutes_of_time(I.tempo_inicio, TRUE) AS MINUTOS_TRUNC,
minutes_of_time(I.tempo_inicio, FALSE) AS MINUTOS_REAL,
seconds_of_time(I.tempo_inicio) AS SEGUNDOS
from teste i
Agora pessoal, convido a assistir o vídeo, explicando o uso das funções deste post.
Dúvidas ou sugestões? Deixe o seu comentário.
Um abraço pessoal e até a próxima!
-
Giovani Da Cruz
-
3.751 views
- 1 comentários
- 4 de abril de 2020
Está gostando do conteúdo? Considere pagar um cafezinho para nossa equipe!
Posts Relacionados - Continue Aprendendo
parabéns