2009-05-12 2 views
0

ich eine Woche im Monat in SQL haben und ich brauche ein Datetime varible aus, dass zu erzeugen .. Felder ich habe, sind dayofweek, weekofmonth und Monatswerte. Kennt jemand eine schnelle effektive Möglichkeit, dies in Mssql 2005 zu berechnen? DankEffizient Weg Datum einzustellen Woche des Monats Wert mit

im Auge behalten. wenn Woche des Monats auf 5 gesetzt ist es die letzte Woche des Monats

Beispiele sind ich habe DayOfWeek, Monat, Jahr, weekofmonth ..

so kann sagen, ich habe DayOfWeek = 2 (Montag) Monat = 5 (Mai) year = 2009 weekofmonth = 5

i Montag erwartet 25. Mai 2009

DayOfWeek = 1, Monat = 5, Woche = 1, year = 2009 = Sonntag, 3. Mai 2009

DayOfWeek = 5, Monat = 4, Woche = 3 = 2009 = Donnerstag 16. April 2009

Zusätzliche Information:

Ich bin mit dem TimeZoneInfo.TransitionTime Klassenbibliothek .net mir zu helfen, einige zu speichern Sachen in der db .. sie sagen:

der Monat Eigenschaft den Monat, in dem definiert die Zeitänderung auftritt. Die Day-Eigenschaft definiert den Wochentag, an dem der Übergang stattfindet. Die Week-Eigenschaft bestimmt, in welcher Woche des Monats die Zeitänderung stattfindet. Gültige Werte der Week-Eigenschaft können zwischen 1 und 5 liegen. Der Wert 5 gibt die letzte Woche des Monats an.

Bisher habe ich dies:

declare @IsFixedDateRule bit 
declare @Day    tinyint 
declare @DayOfweek   tinyint 
declare @Week    tinyint 
declare @Month    tinyint 
declare @Year    int 
declare @TimeofDay   int -- SECONDS 

set @IsFixedDateRule = 0 
set @Day = 1 
set @DayOfweek = 1 
set @Week = 5 
set @Month = 4 
set @year = 2008 
set @TimeofDay = 7200 

declare @date datetime 

if (@IsFixedDateRule = 1) 
begin 
    set @date = convert(char(4),@Year) + '/' + convert(char(2),@Month) + '/' + convert(char(2),@Day) -- Set Year/Month 
end 
else 
begin  
    set @date = convert(char(4),@Year) + '/' + convert(char(2),@Month) + '/01' -- Set Year/Month 

    declare @datepart tinyint 
    set @datepart = datepart(weekday ,@date)  

    set @date = dateadd(week, @week - 1, dateadd(weekday, @Dayofweek - case when @datepart = 7 then 0 else @datepart end, @date))-- get the day 

end 

select dateadd(second, @TimeofDay, @date) -- Add Time Of Day 

etwas sauberer?

+1

einige Beispiele liefern (mehrfach).gegeben x, y, z, Ergebnis ist g .... –

+2

Können Sie einige weitere Beispiele (z. B. was ist dayofweek = 1, weekofmonth = 1, Monat = 5, Jahr = 2009). Und August hat 6 Wochen in diesem Jahr ... ist deine 5. Woche wie ein Maximum? Wenn ja, wie würdest du den 31. August bezeichnen, so dass es sich vom 24. August unterscheidet? – Andomar

+0

Sicher .. Ihr Beispiel würde zeigen Sonntag, 3. Mai 2009 .. krank Bearbeiten Sie meine Post, um weitere Informationen zu enthalten – Bobby

Antwort

0

Die erste Maiwoche beginnt am Freitag. Also welches Datum wäre dayofweek = 1, weekofmonth = 1, month = 5? Ist das Montag, der 27. April?

1

Das ist ziemlich einfach, und wirklich nur fügt Tage und Wochen auf den ersten Tag des Monats. Es nimmt an, dass Sie das aktuelle Jahr verwenden, und wird nicht wirklich Dinge wie die 5. Februarwoche behandeln. (Beispiel: 5. Woche, 3. Tag des Monats Februar gibt 03.11.2009)

DECLARE @CalculatedDate DATETIME; 

-- Assuming DayOfWeek and WeekOfMonth are 1-based 
SELECT @CalculatedDate = DATEADD(DAY, @DayOfWeek - 1, DATEADD(WEEK, @WeekOfMonth - 1, '2009-' + STR(@Month) + '-01')); 

-- Assuming DayOfWeek and WeekOfMonth are 0-based 
SELECT @CalculatedDate = DATEADD(DAY, @DayOfWeek, DATEADD(WEEK, @WeekOfMonth, '2009-' + STR(@Month) + '-01')) 

Es geht auch davon aus, dass DayOfWeek == 1 für den ersten Tag des Monats, so dass es fast definitiv falsch ist. Können wir einige Beispieldaten und erwartete Ausgaben sehen?

+0

Danke für den Vorschlag .. funktioniert perfekt, außer wenn weekofmonth auf 5 eingestellt ist .. sollte letzte Woche des Monats sein .. dies überläuft den nächsten Monat – Bobby

0

EDIT - geänderte auf verschiedene Werte von @@datefirst

Meine Vermutung Griff auf der Grundlage der bisher verfügbaren Daten.

Das funktioniert, wenn Sie SQL Server-Installation @@datefirst Set bis Sonntag (7) oder Montag (1).

Die Testdaten eingerichtet ist, zurückzukehren 01-May-2009

declare @dayofweek int 
declare @weekofmonth int 
declare @month int 
declare @datefirst_adjustment int 


select @datefirst_adjustment = case @@datefirst when 1 then 0 
               when 7 then 1 
           end 

declare @firstofyear datetime 

set @firstofyear = '20090101' 

set @dayofweek = 5 

set @month = 5 

set @weekofmonth = 1 


select dateadd(ww,@weekofmonth - 1,dateadd(mm,@month - 1,@firstofyear)) - datepart(dw,dateadd(mm,@month - 1,@firstofyear)) + @dayofweek + @datefirst_adjustment 
+0

dayofweek = 1, weekofmonth = 1, Monat = 5 gibt den 26. April , Das ist ein Sonntag? – Andomar

+0

Ich habe meine @ Datumswerte falsch eingegeben. Bearbeitet die Beschreibung um dies zu reflektieren. –

+0

versuchen Sie dies für April 2009 mit weekofmonth = 5 sollte 26. April (Woche 5 = letzte Woche des Monats) ?? was bekommst du? – Bobby

0
/* 
* Assuming @year is this year 
*   @day_of_week starts from Sunday = 1, Monday = 2 etc 
*/ 
declare @week_of_month int, 
     @day_of_week int, 
     @month int, 
     @year int, 
     @derived_date datetime 

set dateformat dmy 
select @year = datepart(year, getdate()), 
     @day_of_week = 2, 
     @week_of_month = 2, 
     @month = 5 


select @derived_date = convert(varchar,@year) + '-01-' + convert(varchar,@month) 
select @derived_date 
select @derived_date = dateadd(dd, @day_of_week - datepart(dw, @derived_date), dateadd(week, @week_of_month-1, @derived_date)) 
select @year, @month, @day_of_week, @week_of_month, @derived_date 

/* Test */ 
declare @date datetime 

set @date = '04-MAY-2009' 
select @date, cast(datename(week,@date) as int)- cast(datename(week,dateadd(dd,1-day(@date),@date)) as int)+1 week_of_month, datepart(dw, @date) day_of_weekhere 
+0

-1 Lief diesen Beitrag und es gab viele Zeilen, von denen keine wie eine plausible Antwort aussah (anders als die hardcoded 4-may.) – Andomar

+0

Mein System wird auf dateformat dmy eingestellt, was britische Daten sind. Ich habe den Code bearbeitet, um dies widerzuspiegeln - bitte versuchen Sie es erneut. –

+0

Cool, Downvote entfernt! – Andomar