Array
(
)

PROCEDURE DE LISTAGEM DE DATAS

Carlos Cavalcanti
   - 07 out 2016

Prezados, boa tarde.
Trabalho na área hospitalar e me foi solicitado desenvolver um INDICADOR em aplicativo próprio que apresente uma estatística de PACIENTE-DIA em um período.
Ao desenvolver tal INDICADOR, me deparei que este aplicativo não trabalha com DECLARE's e/ou FUNCTION's. Somente PROCEDURE.
Neste ponto, não consegui avançar, tendo em vista não conhecer o assunto.
Cheguei a desenvolver uma FUNCTION que no SQL SERVER 2008 rodou normalmente (funcionou).
Mas preciso de uma PROCEDURE mesmo.
Segue a idéia:
==============================================================================================================
Resultado esperado:
Paciente internado no dia 02/09/2016 e com alta em 05/09/2016 deverá trazer as linhas abaixo.
02/09/2016 4 - PACIENTES/DIA Clínica Médica 1 9 2 NULL
05/09/2016 4 - PACIENTES/DIA Clínica Médica 1 9 5 NULL
03/09/2016 4 - PACIENTES/DIA Clínica Médica 1 9 3 NULL
04/09/2016 4 - PACIENTES/DIA Clínica Médica 1 9 4 NULL
Uma linha para cada dia internado.
==============================================================================================================
Query desenvolvida:
select convert(varchar(MAX),VALOR,103)
, '4 - PACIENTES/DIA' DESCRICAO
, ES.DESCESPECGRUPO ESPECIALIDADE
, count(*) qtde
, MONTH (convert(varchar(MAX),VALOR,101)) MESES
, DAY (convert(varchar(MAX),VALOR,101)) DIAS
, P.CIDADE CIDADE
from dbo.fn_IntervaloDeDatas('2016-09-01','2016-09-05')
, SZATENDIMENTO as A
INNER JOIN SZPACIENTE AS P
ON A.CODPACIENTE = P.CODPACIENTE
INNER JOIN SZESPECIALIDADE ES
ON A.CODESPECGRUPO = ES.CODESPECGRUPO
where A.TIPOPACIENTE = 'I'
AND A.IDUNIDATEND IN (2)
AND A.DATASAIDA IS NULL ------------ B
and (A.DATAENTRADA <= '2016-09-05' --:PERIODOFINAL
OR A.DATAENTRADA <= '2016-09-01') --:PERIODOINICIAL
AND DAY (A.DATAENTRADA) <= DAY (convert(varchar(MAX),VALOR,101))
AND A.CODPACIENTE = 408727
group by
ES.DESCESPECGRUPO
, a.DATAENTRADA
, p.cidade
, dbo.fn_IntervaloDeDatas.VALOR
==============================================================================================================
Onde usando a Function (dbo.fn_IntervaloDeDatas('2016-09-01','2016-09-05')) me traz o resultado esperado.
Segue a Function:
USE [CorporeRM_Homolog]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[fn_IntervaloDeDatas] ( @valor_inicial DATETIME, @valor_final DATETIME )
RETURNS @tabela_de_intervalos TABLE ( valor DATETIME )
AS
BEGIN
WITH intervalo_de_inteiros(valor) AS
(
select @valor_inicial vi
union all
select valor + 1 from intervalo_de_inteiros
where valor + 1 <= @valor_final
)
INSERT INTO @tabela_de_intervalos
select * from intervalo_de_inteiros option (MAXRECURSION 0)
RETURN
END
==============================================================================================================
Como transformar essa Function em Procedure para que me traga o resultado acima demonstrado?
Grato
Carlos Cavalcanti