Zuerst müssen Sie die Funktion, die Tage zwischen zwei Terminen zu bekommen, so dass folgende Funktion erstellt werden soll:
CREATE FUNCTION [dbo].[GetDatesBetween](@dateFrom AS DATE, @dateTo AS DATE)
returns table as
return (
with
N0 as (SELECT 1 as n UNION ALL SELECT 1)
,N1 as (SELECT 1 as n FROM N0 t1, N0 t2)
,N2 as (SELECT 1 as n FROM N1 t1, N1 t2)
,N3 as (SELECT 1 as n FROM N2 t1, N2 t2)
,N4 as (SELECT 1 as n FROM N3 t1, N3 t2)
,N5 as (SELECT 1 as n FROM N4 t1, N4 t2)
,N6 as (SELECT 1 as n FROM N5 t1, N5 t2)
,nums as (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) as num FROM N6)
SELECT DATEADD(day,num-1,@dateFrom) as thedate
FROM nums
WHERE num <= DATEDIFF(day,@dateFrom,@dateTo) + 1
);
Führen Sie anschließend die folgende Abfrage aus, um das gewünschte Ergebnis zu erhalten:
DECLARE @dteFROM DATE = '2016-01-01'
DECLARE @dteTo DATE = '2017-01-26'
;WITH cteDaysInfo AS
(
SELECT theDate,
YEAR(thedate) YearValue,
DATEDIFF(day, CAST(YEAR(thedate) AS VARCHAR), CAST(YEAR(thedate) + 1 AS VARCHAR)) DaysInYear,
datediff(week, CAST(YEAR(thedate) AS VARCHAR), CAST(YEAR(thedate) + 1 AS VARCHAR)) NumberOfWeeksInYear,
ROW_NUMBER() OVER(ORDER BY theDate) DayNumberContinous,
DATEPART(dayofyear, thedate) DayNumber,
ceiling((ROW_NUMBER() OVER(ORDER BY theDate)) - 1)/7 + 1 WeekNumberContinous,
DATEPART(WEEK, theDate) WeekNumber
FROM dbo.GetDatesBetween(@dteFROM, @dteTo)
)
, cteBaseWeeksInfo AS
(
SELECT YearValue,
(SELECT MIN(theDate) FROM cteDaysInfo t2 WHERE t2.YearValue = t1.YearValue and t2.WeekNumberContinous = t1.WeekNumberContinous) StartDate,
(SELECT MAX(theDate) FROM cteDaysInfo t2 WHERE t2.YearValue = t1.YearValue and t2.WeekNumberContinous = t1.WeekNumberContinous) EndDate,
t1.WeekNumberContinous,
(SELECT MIN(WeekNumber) FROM cteDaysInfo t2 WHERE t2.YearValue = t1.YearValue and t2.WeekNumberContinous = t1.WeekNumberContinous) WeekNumber
FROM cteDaysInfo t1
GROUP BY YearValue, WeekNumberContinous
)
SELECT (SELECT MIN(StartDate) FROM cteBaseWeeksInfo t2 WHERE t2.WeekNumberContinous = t1.WeekNumberContinous) StartDate,
(SELECT MAX(EndDate) FROM cteBaseWeeksInfo t2 WHERE t2.WeekNumberContinous = t1.WeekNumberContinous) EndDate,
(SELECT MAX(WeekNumber) FROM cteBaseWeeksInfo t2 WHERE t2.WeekNumberContinous = t1.WeekNumberContinous) EndDate
FROM cteBaseWeeksInfo t1
GROUP BY WeekNumberContinous
Der erste Tag der Woche Freitag zu sein oder nicht Freitag sein ist nicht wichtig. –
@ SiyavashHamdi, wie kann ich diese Tabelle des Jahres 2016 und 2017 – Shohel
@Shohel generieren, versuchen Sie die Antwort. –