Tempo em ano, mês, dia, horas entre 2 datas
Autor: Leandro Paiva | Publicado: 2012-04-10T12:54:00-04:00


   1:  GO   2:  SET QUOTED_IDENTIFIER ON   3:  GO   4:  -- =============================================   5:  -- Author:        Angelo Carlotto   6:  -- Create date: 09/04/2012   7:  -- Description:       8:  --    Esta função retorna um texto descrevendo o total de tempo entre duas datas   9:  --    O usuário pode escolher dentre ano,mes,dia,hora,min e seg quais parcelas deseja que sejam exibidas  10:  --  Caso o parametro @hasAno=0 e @hasMes=1, caso @ano=2 e @mes=1, neste caso a string retornara será: 25 mes(s)   11:  -- =============================================  12:  ALTER FUNCTION GetStringDescreveTotalTempoEntreDatas  13:      (  14:        @dataInicial DATETIME ,  15:        @dataFinal DATETIME ,  16:        @hasAno BIT ,  17:        @hasMes BIT ,  18:        @hasDia BIT ,  19:        @hasHora BIT ,  20:        @hasMinuto BIT ,  21:        @hasSegundo BIT  22:      )  23:  RETURNS VARCHAR(MAX)  24:  AS   25:      BEGIN  26:          DECLARE @ano INT ,  27:              @dia INT ,  28:              @mes INT ,  29:              @hora INT ,  30:              @minuto INT ,  31:              @segundo INT ,  32:              @retorno VARCHAR(MAX)  33:  &nbsp;  34:  &nbsp;  35:  &nbsp;  36:      /* Inicializa a variavel de retorno */              37:          SET @retorno = ''  38:  &nbsp;  39:      /*Calcula quantos ANOS existem dentre a data inicial e afinal*/  40:          SET @ano = DATEDIFF(YEAR, @dataInicial, @dataFinal)  41:      /*Caso o usuário deseje que conste o total de ANOS(@hasAnos) e @ano seja maior que zero então...*/  42:          IF ( @ano &gt; 0  43:               AND @hasAno = 1  44:             )   45:              BEGIN  46:          /*Pega-se o total de ANOS e decrementa-se da dataFinal, gerando uma nova data, agora sem o total de ANOS */  47:                  SET @dataFinal = DATEADD(YEAR, -1 * @ano, @dataFinal)  48:          /*Realiza-se a concatenação do texto  contendo o total de ANOS na variavel de retorno*/          49:                  SET @retorno = @retorno + ' ' + CAST(@ano AS VARCHAR(2))  50:                      + ' ano(s)'  51:              END  52:  &nbsp;  53:      /*Calcula quantos MESES existem dentre a data inicial e afinal*/  54:          SET @mes = DATEDIFF(MONTH, @dataInicial, @dataFinal)          55:      /*Caso o usuário deseje que conste o total de MESES(@hasMes) e @mes seja maior que zero então...*/  56:          IF ( @mes &gt; 0  57:               AND @hasMes = 1  58:             )   59:              BEGIN  60:          /*Pega-se o total de MESES e decrementa-se da dataFinal, gerando uma nova data, agora sem o total de MESES */  61:                  SET @dataFinal = DATEADD(MONTH, -1 * @mes, @dataFinal)  62:          /*Realiza-se a concatenação do texto contendo o total de MESES na variavel de retorno*/          63:                  SET @retorno = @retorno + ' ' + CONVERT(VARCHAR, @mes)  64:                      + ' mes(s)'  65:              END  66:  &nbsp;  67:      /*Calcula quantos DIAS existem dentre a data inicial e afinal*/  68:          SET @dia = DATEDIFF(DAY, @dataInicial, @dataFinal)          69:      /*Caso o usuário deseje que conste o total de DIAS(@hasDias) e @dia seja maior que zero então...*/  70:          IF ( @dia &gt; 0  71:               AND @hasDia = 1  72:             )   73:              BEGIN  74:          /*Pega-se o total de DIAS e decrementa-se da dataFinal, gerando uma nova data, agora sem o total de DIAS */  75:                  SET @dataFinal = DATEADD(DAY, -1 * @dia, @dataFinal)  76:          /*Realiza-se a concatenação do texto contendo o total de DIAS na variavel de retorno*/          77:                  SET @retorno = @retorno + ' ' + CONVERT(VARCHAR, @dia)  78:                      + ' dia(s)'  79:              END  80:  &nbsp;  81:      /*Calcula quantos HORAS existem dentre a data inicial e afinal*/  82:          SET @hora = DATEDIFF(HOUR, @dataInicial, @dataFinal)  83:      /*Caso o usuário deseje que conste o total de HORAS(@hasHoras) e @horas seja maior que zero então...*/  84:          IF ( @hora &gt; 0  85:               AND @hasHora = 1  86:             )   87:              BEGIN  88:          /*Pega-se o total de HORAS e decrementa-se da dataFinal, gerando uma nova data, agora sem o total de HORAS */  89:                  SET @dataFinal = DATEADD(HOUR, -1 * @hora, @dataFinal)  90:          /*Realiza-se a concatenação do texto contendo o total de HORAS na variavel de retorno*/          91:                  SET @retorno = @retorno + ' ' + CONVERT(VARCHAR, @hora)  92:                      + ' hora(s)'  93:              END          94:  &nbsp;  95:      /*Calcula quantos MINUTOS existem dentre a data inicial e afinal*/  96:          SET @minuto = DATEDIFF(MINUTE, @dataInicial, @dataFinal)      97:      /*Caso o usuário deseje que conste o total de MINUTOS(@hasMinutos) e @minuto seja maior que zero então...*/  98:          IF ( @minuto &gt; 0  99:               AND @hasMinuto = 1 100:             )  101:              BEGIN 102:                  SET @dataFinal = DATEADD(MINUTE, -1 * @minuto, @dataFinal) 103:          /*Realiza-se a concatenação do texto contendo o total de MINUTOS na variavel de retorno*/         104:                  SET @retorno = @retorno + ' ' + CONVERT(VARCHAR, @minuto) 105:                      + ' min(s)' 106:              END         107:  &nbsp; 108:      /*Calcula quantos SEGUNDOS existem dentre a data inicial e afinal*/     109:          SET @segundo = DATEDIFF(SECOND, @dataInicial, @dataFinal)     110:      /*Caso o usuário deseje que conste o total de SEGUNDOS(@hasSegundo) e @segundo seja maior que zero então...*/     111:          IF ( @segundo &gt; 0 112:               AND @hasSegundo = 1 113:             )  114:              BEGIN 115:                  SET @dataFinal = DATEADD(SECOND, -1 * @segundo, @dataFinal) 116:          /*Realiza-se a concatenação do texto contendo o total de SEGUNDOS na variavel de retorno*/         117:                  SET @retorno = @retorno + ' ' + CONVERT(VARCHAR, @segundo) 118:                      + ' s(s)' 119:              END         120:  &nbsp; 121:          RETURN @retorno 122:  &nbsp; 123:      END 124:  GO