2015-09-29 4 views
1

У меня есть запрос, чтобы показать количество платежей, сгруппированных по номеру недели в SQL Server 2012.SQL Server, получить Дата недели номер

SELECT 
    DATEPART(wk, FPP.UPLOAD_DATE) AS "Date by week", 
    COUNT(DISTINCT FPP.ID) AS "Number of Bills") 
FROM 
    FACT_PAY_PAYMENT FPP 
GROUP BY 
    DATEPART(wk, FPP.UPLOAD_DATE); 

Небольшая проблема, когда я делаю этот код, я получите номер недели, но мне нужна дата начала недели.

К примеру, сейчас я получать следующий вывод:

Date by week  Number of Bills 
--------------------------------- 
     40     7 

То, что я хочу получить это:

Date by week  Number of Bills 
--------------------------------- 
2015-09-28   7 
+0

Я не понимаю ... 8 Сентябрь в 2015 году - вторник. Есть ли причина для этой даты? – Shnugo

+0

Должно быть 28th, thx – Jonas

+0

ОК, поэтому мой ответ должен быть правильным ... – Shnugo

ответ

1

Используйте DATEDIFF(), чтобы получить количество недель с начала, а затем DATEADD(), чтобы получить первая дата. Например;

DECLARE @date DATETIME = GETDATE() 

SELECT DATEADD(WEEK, DATEDIFF(WEEK, 0, @date) , 0) FirstDayOfWeek 

Вы можете применить его к вашему запросу, заменив @date на название столбца. Это было бы похоже;

SELECT 
    DATEADD(WEEK, DATEDIFF(WEEK, 0, FPP.UPLOAD_DATE) , 0) AS "Date by week", 
    COUNT(DISTINCT FPP.ID) AS "Number of Bills" 
FROM 
    FACT_PAY_PAYMENT FPP 
GROUP BY 
    DATEADD(WEEK, DATEDIFF(WEEK, 0, FPP.UPLOAD_DATE) , 0); 
1

Пожалуйста, попробуйте

DECLARE @d AS DATETIME =GETDATE(); 

SELECT DATEPART(ISO_WEEK,@d) AS WeekIndex 
     ,DATEADD(DAY,DATEPART(WEEKDAY,@d) * (-1) /* The following "+1" is depending on system's culture, look at DATEFIRST !!! */ + 1 ,@d) AS MondayForThisWeek 

Это вернется с индексом в неделю на определенную дату и в понедельник на этой неделе.

Помните о некоторых проблемах с культурой системы (особенно DATEFIRST !!!), индексом недели на конец года и датами в целом (включенный компонент времени).

4

Сначала вы должны убедиться, что это DATEFIRST недели SELECT @@DATEFIRST;, В моей машине Sunday является First day of week

DECLARE @dt DATE = '2015-09-08'; 
SELECT DATEADD(wk,DATEDIFF(wk,7,@dt),6) AS Datebyweek 

Результат

Datebyweek 
2015-09-06 00:00:00.000