Inquiridor
Registro num intervalo de dias e horas

Pergunta
-
Prezados, se possível gostaria de uma ajuda com o seguinte caso:
Preciso dos registros de atendimentos de um intervalo de dias e horas. Porém no meu BD o tenho uma coluna para data e outra para hora.
Quando uso o este script, os campos de hora entram em divergência, como resolver?
Obrigado pela ajuda de sempre!
SELECT
SZATENDIMENTO.DATAENTRADA,
SZATENDIMENTO.CODPACIENTE AS 'PACIENTE_PRONTUARIO',
SZATENDIMENTO.CODATENDIMENTO AS 'PACIENETE_ATENDIMENTO',
SZPACIENTE.NOMEPACIENTE AS 'PACIENTE_NOME',
SZATENDIMENTO.RESPGRAVACAOCONTA AS 'ATENDENTE',
FROM SZATENDIMENTO (NOLOCK)
INNER JOIN SZPACIENTE ON
SZATENDIMENTO.CODPACIENTE = SZPACIENTE.CODPACIENTE
WHERE SZATENDIMENTO.TIPOPACIENTE = 'E'
AND SZATENDIMENTO.DATAENTRADA>='2020-10-13'
AND SZATENDIMENTO.DATAENTRADA<='2020-10-14'
AND SZATENDIMENTO.HORAENTRADA>=1900
AND SZATENDIMENTO.HORAENTRADA<=0100
AND SZATENDIMENTO.CODPRESTADOR = 4
AND SZATENDIMENTO.CODCOMPRADOR = 17
AND SZATENDIMENTO.IDUNIDATEND IN (24,3)
Todas as Respostas
-
Thiago,
Se você estiver utilizando o SQL Server 2012 ou Superior, talvez o uso da função Concat(), realizando a concatenação da Data e Hora, na cláusula Where poderá lhe ajudar, lógicamente temos que analisar o possível impacto no processamento que esta implementação pode provocar.
Veja o exemplo de código que eu elaborei de forma adaptada a sua necessidade:
-- Criando a Tabela de Atendimento -- Create Table Atendimento (Codigo Int Identity(1,1) Primary Key, Nome Varchar(20), DataEntrada Date, HoraEntrada Time, DataSaida Date, HoraSaida Time) Go -- Inserindo os dados -- Insert Into Atendimento (Nome, DataEntrada, HoraEntrada, DataSaida, HoraSaida) Values ('A',GetDate(), GetDate(), GetDate()+2, DATEADD(HOUR,2,GetDate())), ('B',GetDate()+1, GetDate(), GetDate()+4, DATEADD(HOUR,4,GetDate())), ('C',GetDate()+2, GetDate(), GetDate()+6, DATEADD(HOUR,6,GetDate())), ('D',GetDate()+3, GetDate(), GetDate()+8, DATEADD(HOUR,8,GetDate())), ('D',GetDate()+4, GetDate(), GetDate()+10, DATEADD(HOUR,10,GetDate())) Go -- Retornando o Select com o filtro da concatenação em relação a Data e Hora aplicada a cláusula Where -- Select Codigo, Nome, CONCAT(DataEntrada,' ',HoraEntrada) As DataEntrada, CONCAT(DataSaida,' ',HoraSaida) As DataSaida From Atendimento Where DataEntrada BetWeen '2020-10-16 14:02:36.1000000' And '2020-10-17 14:04:21.7600000' Go
Uma outra abordagem seria transforma o seu código em uma CTE e depois fazer o filtro, veja abaixo:
;With CTEAtendimento (Codigo, Nome, DataEntrada, DataSaida) As ( Select Codigo, Nome, CONCAT(DataEntrada,' ',HoraEntrada) As DataEntrada, CONCAT(DataSaida,' ',HoraSaida) As DataSaida From Atendimento) Select * From CTEAtendimento Where DataEntrada >= '2020-10-15 14:04:21.7600000' And DataSaida <='2020-10-22 22:04:21.7600000' Go
Peço que realize uma análise, validando e identificando as possíveis adaptações ao seu código.
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
Boa tarde,
Thiago, considerando que a coluna HoraEntrada seja do tipo inteiro, experimente substituir o trecho abaixo:
AND SZATENDIMENTO.DATAENTRADA>='2020-10-13' AND SZATENDIMENTO.DATAENTRADA<='2020-10-14' AND SZATENDIMENTO.HORAENTRADA>=1900 AND SZATENDIMENTO.HORAENTRADA<=0100
por
AND dateadd (minute, SZATENDIMENTO.HORAENTRADA % 100, dateadd (hour, SZATENDIMENTO.HORAENTRADA / 100, SZATENDIMENTO.DATAENTRADA)) between '2020-10-13 19:00' and '2020-10-14 01:00'
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br