Visualizzazione dei risultati da 1 a 2 su 2

Discussione: Sql Server

  1. #1

    Sql Server

    Ciao a tutti
    Scrivo poco sul forum in quanto riesco a trovare tutte le soluzioni con il search, ma ora non riesco a trovare una risposta al mio problema.
    Ho un SQL server e devo fare delle oprazioni sulle date. Mi servirebbe impostare, per il 2010, la prima settimana dell'anno con il periodo 04/01 - 10/01.
    Per impostare il primo giorno della settimana uso il SET DATEFIRST 1; che è Lunedi, ma se faccio il datepart(wk, etc etc. sulla settimana in questione mi risponde 2.
    Come posso fare a farmi rispondere 1 e portarlo avanti per tutto l'anno?
    La cosa più semplice saperre datepart(wk.....)-1 ma vorrei evitare tale artificio.

    Grazie a tutti

    Zio

  2. #2
    Questa volta potrei essere utile io.
    Ho trovato la soluzione

    Creare la funzione qui sotto in SQL Server

    CREATE FUNCTION dbo.udf_GetISOWeekNumberFromDate(@dtDate as DATETIME) RETURNS INT WITH RETURNS NULL ON NULL INPUT
    /*
    ** Return the ISO week of the year regardless of the DATEFIRST session setting.
    */
    AS
    BEGIN

    DECLARE @intISOWeekdayNumber INT
    DECLARE @dtThisThursday DATETIME
    DECLARE @dtFirstOfThisThursdaysYear DATETIME
    DECLARE @intISOWeekdayNumberOfFirstOfThisThursdaysYear INT
    DECLARE @dtFirstThursdayOfYear DATETIME
    DECLARE @intISOWeekNumber INT

    -- Get the ISO week day number (Monday = 1) for our date.
    SET @intISOWeekdayNumber = (((DATEPART(dw, @dtDate) - 1) + (@@DATEFIRST - 1)) % 7) + 1

    -- Get the date of the Thursday in this ISO week.
    SET @dtThisThursday = DATEADD(d,(4 - @intISOWeekdayNumber),@dtDate)

    -- Get the date of the 1st January for 'this Thursdays' year.
    SET @dtFirstOfThisThursdaysYear = CAST(CAST(YEAR(@dtThisThursday) AS CHAR(4)) + '-01-01' AS DATETIME)

    SET @intISOWeekdayNumberOfFirstOfThisThursdaysYear = (((DATEPART(dw, @dtFirstOfThisThursdaysYear) - 1) + (@@DATEFIRST - 1)) % 7) + 1

    -- Get the date of the first Thursday in 'this Thursdays' year.
    -- The year of which the ISO week is a part is the year of this date.
    IF (@intISOWeekdayNumberOfFirstOfThisThursdaysYear in (1,2,3,4))
    SET @dtFirstThursdayOfYear = DATEADD(d,(4 - @intISOWeekdayNumberOfFirstOfThisThursdaysYear),@d tFirstOfThisThursdaysYear)
    ELSE
    SET @dtFirstThursdayOfYear = DATEADD(d,(4 - @intISOWeekdayNumberOfFirstOfThisThursdaysYear + 7),@dtFirstOfThisThursdaysYear)

    -- Work out how many weeks from the first Thursday to this Thursday.
    SET @intISOWeekNumber = DATEDIFF(d,@dtFirstThursdayOfYear,@dtThisThursday)/7+1

    RETURN @intISOWeekNumber

    END
    GO


    e richiamatela su una qualsiasi query con dbo.udf_GetISOWeekNumberFromDate
    esempio:
    set datefirst 1;
    select datepart(wk,'2010-01-15')
    sarà uguale a
    set datefirst 1;
    select dbo.udf_GetISOWeekNumberFromDate('2010-01-15')

    Questo fa si che tutti numeri di settimana saranno compatibili ISO8601 che definisce il numero di settimana ogni anno.
    Il set datefirst 1; definisce che il primo giorno della settimana è Lunedì

    La funziona può essere creata su sistemi SQL 2005 e 2008 per i sistemi 2000 bisogna togliere la stringa "WITH RETURNS NULL ON NULL INPUT"

    Sperando di esservi stato d'aiuto vi saluto.

    Zio

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.