Fórum Convert SQL SERVER #605849

07/10/2019

0

SQL

OLá,

Preciso fazer uma subtração das batidas de ponto, mas os campos são do tipo varchar e contém dados, como: Férias e Folga.
Por este motivo, retorna erro. Tentei alguns convert e ate agora não tive sucesso.

Postarei abaixo o meu select. No caso gostaria de subtrair a saida2 - entrada1, pra ter o saldo.

select 
       funcionario
       data,
       entrada1,
       saida1,
       entrada2,
       saida2

from tabela_batidasponto	    


b


Poderiam me ajudar .
Simone

Simone

Responder

Posts

07/10/2019

Emerson Nascimento

dê um exemplo dos conteúdos dos campos
Responder

Gostei + 0

07/10/2019

Simone

Exemplo do retorno do select acima:

FuncionarioX
data = 2019-10-07 00:00:00
08:00
12:00
13:00
17:00





porem, como o campo é varchar, contem informação como Férias e Folga.

ficando assim:


FuncionarioY
2019-10-07 00:00:00
férias
férias
férias
férias




Responder

Gostei + 0

08/10/2019

Emerson Nascimento

tente algo assim:
SELECT
	funcionario,
	data,
	entrada1,
	saida1,
	entrada2,
	saida2,
	case	when	not upper(left(entrada1,1)) like '[A-Z]'
					and not upper(left(saida1,1)) like '[A-Z]'
					and not upper(left(entrada2,1)) like '[A-Z]'
					and not upper(left(saida2,1)) like '[A-Z]'
			then
				convert(varchar(5),
					convert(datetime,(convert(varchar(10),data,101) + ' ' + saida1)) - convert(datetime,(convert(varchar(10),data,101) + ' ' + entrada1))+
					convert(datetime,(convert(varchar(10),data,101) + ' ' + saida2)) - convert(datetime,(convert(varchar(10),data,101) + ' ' + entrada2))
				,8)
			else
				entrada1
	end resultado

FROM
	tabela_batidasponto
ORDER BY
	funcionario, data

Responder

Gostei + 0

23/10/2019

Simone

tente algo assim:
SELECT
	funcionario,
	data,
	entrada1,
	saida1,
	entrada2,
	saida2,
	case	when	not upper(left(entrada1,1)) like '[A-Z]'
					and not upper(left(saida1,1)) like '[A-Z]'
					and not upper(left(entrada2,1)) like '[A-Z]'
					and not upper(left(saida2,1)) like '[A-Z]'
			then
				convert(varchar(5),
					convert(datetime,(convert(varchar(10),data,101) + ' ' + saida1)) - convert(datetime,(convert(varchar(10),data,101) + ' ' + entrada1))+
					convert(datetime,(convert(varchar(10),data,101) + ' ' + saida2)) - convert(datetime,(convert(varchar(10),data,101) + ' ' + entrada2))
				,8)
			else
				entrada1
	end resultado

FROM
	tabela_batidasponto
ORDER BY
	funcionario, data





Oi Emerson, me deculpa pelo a demora cheguei a testar, mas apareceram outras prioridades não conseguir voltar aqui pra da o feedback.
Então, essa query ta quase perfeita, não fosse a diferença dos minutos.

Meu retorno:
func        data                         ent1         sai1        ent2        sai2       htrabalhadas
6	2019-10-14 00:00:00	07:57	12:30	13:31	17:17	08:19
6	2019-10-15 00:00:00	07:59	12:29	13:19	17:21	08:32
6	2019-10-16 00:00:00	08:02	13:08	14:02	17:25	08:29
6	2019-10-17 00:00:00	07:54	13:15	14:10	17:14	08:25
6	2019-10-18 00:00:00	08:00	13:42	14:27	17:12	08:27




Se for somar as colunas ent1 e sai2, o saldo de htrabalhadas fica um pouco diferente do retorno do select.

Por exemplo
Ent1 = 7:59 + Sai2 = 7:21 , o total de htrabalhadas não deveria ser 22:00?





Responder

Gostei + 0

23/10/2019

Simone

tente algo assim:
SELECT
	funcionario,
	data,
	entrada1,
	saida1,
	entrada2,
	saida2,
	case	when	not upper(left(entrada1,1)) like '[A-Z]'
					and not upper(left(saida1,1)) like '[A-Z]'
					and not upper(left(entrada2,1)) like '[A-Z]'
					and not upper(left(saida2,1)) like '[A-Z]'
			then
				convert(varchar(5),
					convert(datetime,(convert(varchar(10),data,101) + ' ' + saida1)) - convert(datetime,(convert(varchar(10),data,101) + ' ' + entrada1))+
					convert(datetime,(convert(varchar(10),data,101) + ' ' + saida2)) - convert(datetime,(convert(varchar(10),data,101) + ' ' + entrada2))
				,8)
			else
				entrada1
	end resultado

FROM
	tabela_batidasponto
ORDER BY
	funcionario, data





Oi Emerson, me deculpa pelo a demora cheguei a testar, mas apareceram outras prioridades não conseguir voltar aqui pra da o feedback.
Então, essa query ta quase perfeita, não fosse a diferença dos minutos.

Meu retorno:
func  data                         ent1         sai1        ent2        sai2       htrabalhadas
6	2019-10-14 00:00:00	07:57	12:30	13:31	17:17	08:19
6	2019-10-15 00:00:00	07:59	12:29	13:19	17:21	08:32
6	2019-10-16 00:00:00	08:02	13:08	14:02	17:25	08:29
6	2019-10-17 00:00:00	07:54	13:15	14:10	17:14	08:25
6	2019-10-18 00:00:00	08:00	13:42	14:27	17:12	08:27




Se for somar as colunas ent1 e sai2, o saldo de htrabalhadas fica um pouco diferente do retorno do select.

Por exemplo
Ent1 = 7:59 + Sai2 = 7:21 , o total de htrabalhadas não deveria ser 08:22 ?





Responder

Gostei + 0

23/10/2019

Emerson Nascimento

Se for somar as colunas ent1 e sai2, o saldo de htrabalhadas fica um pouco diferente do retorno do select.

Por exemplo
Ent1 = 7:59 + Sai2 = 7:21 , o total de htrabalhadas não deveria ser 22:00?

você está correta, Simone.
Eu não previ que haveria apontamento em dias distintos. pra resolver isso basta alterar a query:
SELECT
    funcionario,
    data,
    entrada1,
    saida1,
    entrada2,
    saida2,
    case    when    not upper(left(entrada1,1)) like '[A-Z]'
                    and not upper(left(saida1,1)) like '[A-Z]'
                    and not upper(left(entrada2,1)) like '[A-Z]'
                    and not upper(left(saida2,1)) like '[A-Z]'
            then
                convert(varchar(5),
                    convert(datetime,(convert(varchar(10),dateadd(dd,(case when saida1 < entrada1 then 1 else 0 end),data),101) + ' ' + saida1)) - convert(datetime,(convert(varchar(10),data,101) + ' ' + entrada1))+
                    convert(datetime,(convert(varchar(10),dateadd(dd,(case when saida2 < entrada2 then 1 else 0 end),data),101) + ' ' + saida2)) - convert(datetime,(convert(varchar(10),data,101) + ' ' + entrada2))
                ,8)
            else
                entrada1
    end resultado
 FROM
    tabela_batidasponto
ORDER BY
    funcionario, data

Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar