Validar mês e ano SQL Server

Validar mês e ano SQL Server 2019!

Uma maneira simples e eficiente de validar parâmetros passados em consultas, stored procedures, funções.

Vez o outro precisamos de uma forma de validar parâmetros de mês e ano, ou ainda limitar os ranges de utilização. Segue uma maneira simples para fazermos isso.

Então, sem muitas delongas. Veja:

/*
Funcionalidade: Validar o mês no SQL
Criado em: 18/05/2010
Criado por: Anderson Abreu
Descrição: Validar parâmetro mes como variável
Regras:
*/

use master
GO

if db_id('tst_database') is not null
drop database tst_database
go

create database tst_database
go

use tst_database
go


CREATE FUNCTION [dbo].[fg_verifica_ano] ( @ano int )
RETURNS bit
as
BEGIN
    DECLARE @valido bit

    IF @ano IS NOT NULL
    BEGIN
        SET @valido = 0
        IF len(@ano) = 4 AND @ano >= 2004 and @ano <= 2200
            BEGIN
                SET @valido=1
            END
    END

    RETURN @valido
END
go


CREATE FUNCTION [dbo].[fg_verifica_mes] ( @mes int )
RETURNS bit
as
BEGIN
    DECLARE @valido bit

    IF @mes IS NOT NULL
    BEGIN
        SET @valido = 0
        IF @mes between 1 and 12
        BEGIN
            SET @valido=1
        END
    END

    RETURN @valido
END
go


-- Vamos Testar
select dbo.fg_verifica_ano(2020)
select dbo.fg_verifica_ano(202) -- Erro

select dbo.fg_verifica_mes(12)
select dbo.fg_verifica_mes(13) -- Erro



create procedure proc_mes_ano (@mes tinyint, @ano smallint)
as
begin
    set nocount on
    set dateformat YMD

    declare @checkError bit = 0, @dtInicio varchar(20), @dtFim varchar(20);

    if OBJECT_ID('tempdb.dbo.#temp_error', 'U') is not null
        drop table #temp_error;

    create table #temp_error ( name varchar(255) );

    IF dbo.fg_verifica_ano(@ano) = 0
    begin
        insert into #temp_error values ('Ano inválido')
        set @checkError = 1
    end

    IF @mes is not null
        IF dbo.fg_verifica_mes(@mes) = 0
        begin
            insert into #temp_error values ('Mês inválido')
            set @checkError = 1
        end

    if @checkError = 1
        Select * from #temp_error
    else
    begin
        if OBJECT_ID('tempdb.dbo.#temp_all', 'U') IS NOT NULL
            drop table #temp_all;

        if @mes = 1
            set @dtInicio = cast(cast(@ano-1 as char(4)) +'-'+ cast((12) as varchar(2)) +'-1 00:00' as datetime)
        else
            set @dtInicio = cast(cast(@ano as char(4)) +'-'+ cast((@mes-1) as varchar(2)) +'-2 00:00' as datetime)

        set @dtFim = cast(cast(@ano as char(4)) +'-'+ cast((@mes) as varchar(2)) +'-21 00:00' as datetime)

        select * from sys.databases where create_date between @dtInicio and @dtFim
    end

    set nocount off
end


declare @mes tinyint = month(getdate()), @ano smallint = year(getdate())
exec proc_mes_ano @mes, @ano
GO

--Produzindo o erro
exec proc_mes_ano 13, 2020
GO

exec proc_mes_ano 11, 202
GO

exec proc_mes_ano 0, 202
GO


-- Excluindo dados de teste
use master
go

drop database tst_database
go

 

Anderson Abreu