2017-12-07 5 views
0

Ich versuche, die Woche Zahlen zu tatsächlichen Daten basierend auf meiner Anfrage zu konvertieren:Konvertieren Woche Name Datum SQL

Beispiel:

: week 1 2017 sollte January 2, 2017

SELECT CONVERT(nvarchar(10),DATEADD(day,DATEPART(WEEK,[DeliveryDate])*7-(DATEPART(WEEKDAY,CAST(DATEPART(YEAR,[DeliveryDate]) as nvarchar(4))+'-01-01')-2),CAST(DATEPART(YEAR,[DeliveryDate]) as nvarchar(4))+'-01-01'),126) AS week_name, 
AVG(DATEDIFF(day, CONVERT(date, [UnloadDate]), CONVERT(date, [DeliveryDate]))) as Average_Delivery_Days FROM [CARGODB].[dbo].[Cargo_Transactions] 
WHERE [DeliveryDate] IS NOT NULL AND [DeliveryDate] != 0 
AND [UnloadDate] IS NOT NULL AND [UnloadDate] != 0 AND [DeliveryDate] > [UnloadDate] 
AND [Deleted] = 0 and [StageID] = 'D' AND [RouteID] IS NOT NULL AND [RouteID] != '' AND CONVERT(date, [DeliveryDate]) BETWEEN '2016-01-01' AND GETDATE() 
AND CONVERT(date, [DeliveryDate]) >= DATEADD(week, -24, getdate()) GROUP BY DATEPART(YEAR,[DeliveryDate]), DATEPART(WEEK,[DeliveryDate]) ORDER BY DATEPART(YEAR,[DeliveryDate]) ASC, DATEPART(WEEK,[DeliveryDate]) ASC; 

Dieser Teil umgewandelt werden

CONVERT(nvarchar(10),DATEADD(day,DATEPART(WEEK,[DeliveryDate])*7-(DATEPART(WEEKDAY,CAST(DATEPART(YEAR,[DeliveryDate]) as nvarchar(4))+'-01-01')-2),CAST(DATEPART(YEAR,[DeliveryDate]) as nvarchar(4))+'-01-01'),126) 

kam von diesem link.

Aber ich überprüfe meine Daten und ich denke, dass es nicht korrekt ist. Ich habe einen mit einem Epoch Converter verglichen. Zum Beispiel: week 25 2017 sollte June 19, 2017 sein, aber es zeigt June 26, 2017 an und wenn ich das Datum im Epochenkonverter überprüfte, sollte es week 26 2017 und so weiter sein.

CONVERT(varchar(10),dateadd (week, DATEPART(WEEK, [DeliveryDate]), dateadd (year, DATEPART(YEAR, [DeliveryDate])-1900, 0)) - 4 - datepart(dw, dateadd (week, DATEPART(WEEK, [DeliveryDate]), dateadd (year, DATEPART(YEAR, [DeliveryDate])-1900, 0)) - 4) + 1, 126) 
montags

Es gibt mir die Woche Termine wie Sonntage, aber ich möchte, dass die Woche zu starten, so:

UPDATE

Ich habe einen Weg zu bekommen, was ich will mit diesem Teil gefunden Ich fügte SET DATEFIRST 1 hinzu. Aber direkt nach dem Hinzufügen zu meiner Abfrage, leitet es zum nächsten Montag weiter. Ich habe erwartet, dass es ist: June 18, 2017 (Sunday) in June 19, 2017 (Monday), aber ich bekomme June 26, 2017 (Monday) statt.

Was ist los mit meiner Abfrage?

+0

Nein, überprüfen Sie den Epoch Converter erneut. "Woche 25 2017" ist "19. Juni 2017". Verwenden Sie diese Abfrage also. 'declare @wk int = 25 Datum auswählenadd (Woche, @ wk-1, DATENADD (wk, DATEDIFF (wk, -1, DATENADD (yy, DATEDIFF (yy, 0, getdate()), 0)), 0)) ' –

+0

Danke @WEI_DBA für Ihre Antwort. Es hat die richtige Antwort für 2017 geliefert. Was aber, wenn ich ein anderes Jahr brauche? Entschuldigung für die Mühe und danke für Ihre Hilfe! –

+0

Ändern Sie 'getdate()' an das gewünschte Datum. –

Antwort

0

das ist nur und Beispiel, was ich verstanden habe. können Sie verschiedene Beispieldaten angeben und Ihr Outout erklären.

declare @i varchar(50)='week 1 2017' 

     select weekNumber,FOY,dateadd(day,-6,dateadd(week,cast(weekNumber as int),cast(FOY as datetime)))ReqDate 
from 
(
select substring(ltrim(replace(@i,'week','')),0,CHARINDEX(' ',ltrim(replace(@i,'week','')))) weekNumber, 
right(@i,4) +'-01-01'FOY 

)t4