Sql server Excel到SQL公式转换(计算自定义周开始的周数)

Sql server Excel到SQL公式转换(计算自定义周开始的周数),sql-server,excel,Sql Server,Excel,目前,我有一个Excel电子表格,它使用公式计算“商业周刊编号”。我想做一个SQL语句,选择可以传递日期的位置,并为我计算周数(如果可能的话) Excel公式是如何工作的 商业周总是从周一开始,周日结束 这一年总是从10月27日到11月2日开始(因此,有时一年有52周,有时53周) 每个工作周总有7天 如果有帮助,请参见公式的工作原理(单元格公式): Cell C9=如果(或(和)天(B9)>26, 月(B9)=10,工作日(B9)=2),和(天(B9)=开始日期 ((DATEDIFF(DA

目前,我有一个Excel电子表格,它使用公式计算“商业周刊编号”。我想做一个SQL语句,选择可以传递日期的位置,并为我计算周数(如果可能的话)

Excel公式是如何工作的

  • 商业周总是从周一开始,周日结束

  • 这一年总是从10月27日到11月2日开始(因此,有时一年有52周,有时53周)

  • 每个工作周总有7天
如果有帮助,请参见公式的工作原理(单元格公式):

Cell C9=如果(或(和)天(B9)>26,
月(B9)=10,工作日(B9)=2),和(天(B9)=开始日期
((DATEDIFF(DAY,@StartDate,@DateForCheck)+7)/7)以“工作周编号”结束

上面的代码给我的输出是52,但是如果我将@DateForCheck更改为'2018-10-28',它会给我53(如果日期在10月27日和11月2日之间,我需要从1开始重新计数)

最后得到它,如果有人有类似的问题,我会在这里发布我的解决方案。如果你有更好的解决方案,请在这里发布

DECLARE @Input datetime;
SET @Input = '2020-11-1';

DECLARE @YearStart datetime;
DECLARE @Mon datetime;

-- FIND WHERE IS MONDAY IN THE SELECTED YEAR INPUT
SET @Mon = CASE
        WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-10-27')) = 'Monday'
            THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-10-27')
        WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-10-28')) = 'Monday'
            THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-10-28')
        WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-10-29')) = 'Monday'
            THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-10-29')
        WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-10-30')) = 'Monday'
            THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-10-30')
        WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-10-31')) = 'Monday'
            THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-10-31')
        WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-11-1')) = 'Monday'
            THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-11-1')
        WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-11-2')) = 'Monday'
            THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-11-2')
    END

-- BASED ON WHERE MONDAY FALLS, SET THE YEAR START
IF @Input >= @Mon
    SET @YearStart = @Mon
ELSE
    SET @YearStart = CASE
                    WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-10-27')) = 'Monday'
                        THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-10-27')
                    WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-10-28')) = 'Monday'
                        THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-10-28')
                    WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-10-29')) = 'Monday'
                        THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-10-29')
                    WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-10-30')) = 'Monday'
                        THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-10-30')
                    WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-10-31')) = 'Monday'
                        THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-10-31')
                    WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-11-1')) = 'Monday'
                        THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-11-1')
                    WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-11-2')) = 'Monday'
                        THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-11-2')
                END

--CALCULATE THE BUSINESS WEEK NUMBER
SELECT (DATEDIFF(DAY, @YearStart, @Input)+7) / 7 AS 'Business Week Number'

诀窍是首先查看星期一在所选年份输入项下的位置,然后检查输入项是否在该日期之前,并计算正确日期的年份开始日期。最后只需计算自该日期起已经过去了多少周。

您说一年总是从10月27日到11月2日之间开始。什么决定了新年开始的确切日期?之后r之前第52周或第53周的七天计算取决于哪一年。因此,假设2018年应该有52周,第53周的开始时间在这两个日期之间。这意味着不会有53周,但我们将从第1周开始计算下一年,基本上,每年最少有52周,最多有53周。因此,在e第53周的开始检查第一个日期是否在10月27日至11月2日之间。如果是,从1开始,如果不是,从1开始计算第53周,然后从1开始。换句话说,10月27日至11月2日之间的星期一定义了一年的第一周?例如,2019年的第一周从10月28日星期一开始?2020年的第一周从10月28日星期一开始11月2日?很抱歉我这么晚才说,新生儿在家。但是,是的,10月28日是2019年的年初,2020年的11月2日。
DECLARE @StartDate datetime;
SET @StartDate = '2018-10-29';

DECLARE @DateForCheck datetime;
SET @DateForCheck = '2019-10-27';

SELECT @DateForCheck AS 'Date',
    CASE
        WHEN @DateForCheck < @StartDate THEN 'Only future dates after 27/04/2018 are allowed'
        WHEN @DateForCheck >= @StartDate THEN
            ((DATEDIFF(DAY, @StartDate, @DateForCheck)+7) / 7) END AS 'Business Week Number'
DECLARE @Input datetime;
SET @Input = '2020-11-1';

DECLARE @YearStart datetime;
DECLARE @Mon datetime;

-- FIND WHERE IS MONDAY IN THE SELECTED YEAR INPUT
SET @Mon = CASE
        WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-10-27')) = 'Monday'
            THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-10-27')
        WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-10-28')) = 'Monday'
            THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-10-28')
        WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-10-29')) = 'Monday'
            THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-10-29')
        WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-10-30')) = 'Monday'
            THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-10-30')
        WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-10-31')) = 'Monday'
            THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-10-31')
        WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-11-1')) = 'Monday'
            THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-11-1')
        WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-11-2')) = 'Monday'
            THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input)) + '-11-2')
    END

-- BASED ON WHERE MONDAY FALLS, SET THE YEAR START
IF @Input >= @Mon
    SET @YearStart = @Mon
ELSE
    SET @YearStart = CASE
                    WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-10-27')) = 'Monday'
                        THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-10-27')
                    WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-10-28')) = 'Monday'
                        THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-10-28')
                    WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-10-29')) = 'Monday'
                        THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-10-29')
                    WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-10-30')) = 'Monday'
                        THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-10-30')
                    WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-10-31')) = 'Monday'
                        THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-10-31')
                    WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-11-1')) = 'Monday'
                        THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-11-1')
                    WHEN DATENAME(WEEKDAY, CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-11-2')) = 'Monday'
                        THEN CONVERT(datetime, CONVERT(NVARCHAR(4), DATEPART(YEAR, @Input) -1) + '-11-2')
                END

--CALCULATE THE BUSINESS WEEK NUMBER
SELECT (DATEDIFF(DAY, @YearStart, @Input)+7) / 7 AS 'Business Week Number'