none
Ciclo di Insert tenendo conto ora Solare-Legale RRS feed

  • Domanda

  • Ciao a tutti,
    ho una query che inserisce un record in una tabella di appoggio:

    Declare @MyDate datetime
    set @MyDate = '2010-06-06 22:00:00.000'

    INSERT INTO T_CodaTask (NomeTask, DataRiferimento,IdOggetto)
    VALUES ('Rigenerazione Rapportino 1', @MyDate, 0)


    Dovrei modificare questo script in modo che possa essere eseguito settandogli una DataDa
    e una DataA (non una sola data, come ora), tenendo conto che per il periodo di ora Legale,
    la data dovrebbe essere inserita con le 22 come ora, mentre
    per l'ora Solare dovrebbe avere le 23.

    Come si potrebbe fare una cosa del genere?


    Grazie


    Luigi

     

    giovedì 8 novembre 2012 10:36

Risposte

  • Ciao Luigi,
    spero di aver interpretato correttamente la tua richiesta: la funzione scalare seguente, a fronte di una data (datetime), restituisce la medesima (datetime) tenendo conto dell'intervatto dell'ora solare/legale del momento in cui di fa l'operazione, nel caso di ora solare viene aggiunta +1h. Gli intervalli inseriti sono validi fino al 2026.

    CREATE FUNCTION GetSolarDatetime(@MyDate datetime) RETURNS datetime
    AS
    BEGIN
    	DECLARE @fine_ora_legale datetime;
    	DECLARE @inizio_ora_legale datetime;
    	DECLARE @giorno_inizio_ora_legale char(2);
    	DECLARE @giorno_fine_ora_legale char(2);
     
    	-- estrazione anno corrente
    	DECLARE @anno char(4);
    	SET @anno = year(getdate());
     
    	-- estrazione giorno inizio ora legale per anno
    	SET @giorno_inizio_ora_legale = CASE 
    		WHEN @anno = 2012 THEN '25'
    		WHEN @anno = 2013 THEN '31'
    		WHEN @anno = 2014 THEN '30'
    		WHEN @anno = 2015 THEN '29'
    		WHEN @anno = 2016 THEN '27'
    		WHEN @anno = 2017 THEN '26'
    		WHEN @anno = 2018 THEN '25'
    		WHEN @anno = 2019 THEN '31'
    		WHEN @anno = 2020 THEN '29'
    		WHEN @anno = 2021 THEN '28'
    		WHEN @anno = 2022 THEN '27'
    		WHEN @anno = 2023 THEN '26'
    		WHEN @anno = 2024 THEN '31'
    		WHEN @anno = 2025 THEN '30'
    		WHEN @anno = 2026 THEN '29'
    	END 
    	-- NB: il mese è sempre marzo e le ore sempre 03
    	SET @inizio_ora_legale = CONVERT(Datetime,@anno+'-03-'+@giorno_inizio_ora_legale+' 03:00:00',20); -- 20 = yyyy-mm-dd hh:mm:ss(24h)
     
    	-- estrazione giorno inizio ora legale per anno
    	SET @giorno_fine_ora_legale = CASE 
    		WHEN @anno = 2012 THEN '28'
    		WHEN @anno = 2013 THEN '27'
    		WHEN @anno = 2014 THEN '26'
    		WHEN @anno = 2015 THEN '25'
    		WHEN @anno = 2016 THEN '30'
    		WHEN @anno = 2017 THEN '29'
    		WHEN @anno = 2018 THEN '28'
    		WHEN @anno = 2019 THEN '27'
    		WHEN @anno = 2020 THEN '25'
    		WHEN @anno = 2021 THEN '31'
    		WHEN @anno = 2022 THEN '30'
    		WHEN @anno = 2023 THEN '29'
    		WHEN @anno = 2024 THEN '27'
    		WHEN @anno = 2025 THEN '26'
    		WHEN @anno = 2026 THEN '25'
    	END 
    	-- NB: il mese è sempre ottobre e le ore sempre 03
    	SET @fine_ora_legale = CONVERT(Datetime,@anno+'-10-'+@giorno_fine_ora_legale+' 03:00:00',20); -- 20 = yyyy-mm-dd hh:mm:ss(24h)
    
    	-- controllo se in ora solare, se si viene aumentata di 1h
    	IF (@MyDate < @inizio_ora_legale OR @MyDate > @fine_ora_legale)
    		SET @MyDate = DATEADD(hour, 1, @MyDate) ;
    	
    	RETURN @MyDate;
    END
    GO
    
    

    Spero ti sia d'aiuto.

    Emanuele


    Emanuele Zanchettin | .NET & SQL Server consultant | Twitter | Linkedin

    • Contrassegnato come risposta Ciupaz martedì 20 novembre 2012 10:35
    lunedì 19 novembre 2012 23:30

Tutte le risposte

  • Ciao Luigi,
    spero di aver interpretato correttamente la tua richiesta: la funzione scalare seguente, a fronte di una data (datetime), restituisce la medesima (datetime) tenendo conto dell'intervatto dell'ora solare/legale del momento in cui di fa l'operazione, nel caso di ora solare viene aggiunta +1h. Gli intervalli inseriti sono validi fino al 2026.

    CREATE FUNCTION GetSolarDatetime(@MyDate datetime) RETURNS datetime
    AS
    BEGIN
    	DECLARE @fine_ora_legale datetime;
    	DECLARE @inizio_ora_legale datetime;
    	DECLARE @giorno_inizio_ora_legale char(2);
    	DECLARE @giorno_fine_ora_legale char(2);
     
    	-- estrazione anno corrente
    	DECLARE @anno char(4);
    	SET @anno = year(getdate());
     
    	-- estrazione giorno inizio ora legale per anno
    	SET @giorno_inizio_ora_legale = CASE 
    		WHEN @anno = 2012 THEN '25'
    		WHEN @anno = 2013 THEN '31'
    		WHEN @anno = 2014 THEN '30'
    		WHEN @anno = 2015 THEN '29'
    		WHEN @anno = 2016 THEN '27'
    		WHEN @anno = 2017 THEN '26'
    		WHEN @anno = 2018 THEN '25'
    		WHEN @anno = 2019 THEN '31'
    		WHEN @anno = 2020 THEN '29'
    		WHEN @anno = 2021 THEN '28'
    		WHEN @anno = 2022 THEN '27'
    		WHEN @anno = 2023 THEN '26'
    		WHEN @anno = 2024 THEN '31'
    		WHEN @anno = 2025 THEN '30'
    		WHEN @anno = 2026 THEN '29'
    	END 
    	-- NB: il mese è sempre marzo e le ore sempre 03
    	SET @inizio_ora_legale = CONVERT(Datetime,@anno+'-03-'+@giorno_inizio_ora_legale+' 03:00:00',20); -- 20 = yyyy-mm-dd hh:mm:ss(24h)
     
    	-- estrazione giorno inizio ora legale per anno
    	SET @giorno_fine_ora_legale = CASE 
    		WHEN @anno = 2012 THEN '28'
    		WHEN @anno = 2013 THEN '27'
    		WHEN @anno = 2014 THEN '26'
    		WHEN @anno = 2015 THEN '25'
    		WHEN @anno = 2016 THEN '30'
    		WHEN @anno = 2017 THEN '29'
    		WHEN @anno = 2018 THEN '28'
    		WHEN @anno = 2019 THEN '27'
    		WHEN @anno = 2020 THEN '25'
    		WHEN @anno = 2021 THEN '31'
    		WHEN @anno = 2022 THEN '30'
    		WHEN @anno = 2023 THEN '29'
    		WHEN @anno = 2024 THEN '27'
    		WHEN @anno = 2025 THEN '26'
    		WHEN @anno = 2026 THEN '25'
    	END 
    	-- NB: il mese è sempre ottobre e le ore sempre 03
    	SET @fine_ora_legale = CONVERT(Datetime,@anno+'-10-'+@giorno_fine_ora_legale+' 03:00:00',20); -- 20 = yyyy-mm-dd hh:mm:ss(24h)
    
    	-- controllo se in ora solare, se si viene aumentata di 1h
    	IF (@MyDate < @inizio_ora_legale OR @MyDate > @fine_ora_legale)
    		SET @MyDate = DATEADD(hour, 1, @MyDate) ;
    	
    	RETURN @MyDate;
    END
    GO
    
    

    Spero ti sia d'aiuto.

    Emanuele


    Emanuele Zanchettin | .NET & SQL Server consultant | Twitter | Linkedin

    • Contrassegnato come risposta Ciupaz martedì 20 novembre 2012 10:35
    lunedì 19 novembre 2012 23:30
  • Grazie Emanuele,
    posso applicare la tua soluzione nel mio caso,
    con qualche piccolo aggiustamento.

    Luigi

    martedì 20 novembre 2012 10:35