Получите разницу в неделях, данные сохраняются в формате YYYYWW в TSQL - PullRequest
2 голосов
/ 03 апреля 2019

customer_since хранится как YYYYWW, т. Е. 201852.

Нижеприведенный скрипт используется для определения разницы, однако, когда у меня такая ситуация 201901 - 201852, он дает 48вместо 1. есть ли функция мода или что-то, что может быть включено сюда для решения проблемы?

CAST(CONCAT (DATEPART(YEAR, DATEADD(MONTH, + 9, GETDATE()))
, RIGHT('0' + RTRIM(DATEPART(WEEK, DATEADD(MONTH, - 3, GETDATE()))+1),2)
) AS INT) - a.customer_since AS Customer_since

Ответы [ 2 ]

2 голосов
/ 03 апреля 2019

Вы можете использовать следующий шаблон для получения первой (или последней) даты данного года и недели. Затем, имея действительное время даты, просто используйте DATEDIFF , так как он имеет встроенную функциональность, чтобы получить разницу в неделях:

DECLARE @WeekNo int= 52
DECLARE @Year int=2018

SELECT DATEADD(wk,@WeekNo-1,DATEADD(yy,@Year-1900,0)) AS WeekStart,
       DATEADD(wk,@WeekNo,DATEADD(yy,@Year-1900,0))-1 AS WeekEnd

GO

DECLARE @WeekNo int= 1
DECLARE @Year int=2019


SELECT DATEADD(wk,@WeekNo-1,DATEADD(yy,@Year-1900,0)) AS WeekStart,
       DATEADD(wk,@WeekNo,DATEADD(yy,@Year-1900,0))-1 AS WeekEnd

GO

SELECT DATEDIFF(WEEK, '2018-12-24 00:00:00.000', '2019-01-01 00:00:00.000')

В одном утверждении:

DECLARE @Input01 VARCHAR(6) = '201852' 
       ,@Input02 VARCHAR(6) = '201901'

SELECT DATEDIFF(WEEK, DATEADD(WEEK, RIGHT(@Input01, 2)-1,DATEADD(YEAR,LEFT(@Input01, 4)-1900,0)), DATEADD(WEEK,RIGHT(@Input02, 2)-1,DATEADD(YEAR,LEFT(@Input02, 4)-1900,0)));
0 голосов
/ 03 апреля 2019

Вы можете создать функцию, которая будет принимать строку даты ('201852') и будет возвращать дату наподобие `Create Function Todate (@dt varchar (100)) возвращает дату Начало Объявлять @wk int = (Выберите RIGHT (@)dt, 2))

return (выберите Dateadd (WK, @wk, cast (LEFT (@ dt, 4) в качестве даты))) End`

Теперь все, что вам нужно сделать, этопередайте строку даты в функцию и найдите DATEDIFF с начальной и конечной датой

...