繁体   English   中英

假设每月的第一个星期一是去年该月的第一个星期一,如何计算上一年的同一天

[英]How to calculate previous year same day of week from month suppose first Monday of month would be last year first Monday of that month

如何计算去年的同一天,例如今年五月的第一个星期一将是去年五月的第一个星期一,依此类推。

SELECT 
    ADD_MONTHS(CURRENT_DATE, -12) + 
        ((SELECT day_of_week 
          FROM sys_calendar.calendar 
          WHERE calendar_date = CURRENT_DATE) -
          (SELECT day_of_week 
           FROM sys_calendar.calendar 
           WHERE calendar_date = ADD_MONTHS(CURRENT_DATE, -12)))

我做了上述事情,但是对于像 2021 年 4 月 7 日是一个月的第一个星期三这样的日期,需要 2020 年 4 月 8 日,这是一个月的第二个星期三,但我希望计算 2020 年 4 月 1 日。

样品是

2021/4/7 to 2020/4/1
2021/4/14 to 2020/4/8

我想要的这种计算

尽管上面有所有正确的评论和查询,但我有一个可能对您有用的建议。
如果您所说的是系统中的常见查询,而不是您现在想要查询的内容,我建议您在数据库中创建一个Dim_Date并使用它来查找有关您的日期的信息,而无需使用复杂的慢查询。 这是我的经验之谈,希望对你有帮助。


我还在下面的链接中搜索并找到了适合您的表格。 它是一个 xlsx 文件,附在文末。 下载并导入您的数据库,然后将其与下面的代码一起使用。
日期维度文件


我使用的代码是这样的:

WITH X AS (
SELECT
--- The Number You Want ----
ROW_NUMBER() OVER (PARTITION BY YearMonthNum,DayName ORDER BY DateNum) AS DayWeekNumber 
    ,YearMonthNum
    ,DayName
    ,Date
    ,DateNum
    ,MonthNum
    ,DayNumOfWeek
    ,Year
FROM dbo.dimDate Dim --- The Excel I imported
) 
SELECT DISTINCT * 
FROM X X1
JOIN dbo.MyTable T1 -- My Table And my Date Column
    ON T1.myDate = X1.Date
JOIN X X2 ON X2.Year = X1.Year-1   -- I wanted last year match so (-1). use (-n) for n years ago  
            AND X2.MonthNum = X1.MonthNum
            AND X2.DayNumOfWeek = X1.DayNumOfWeek
            AND X2.DayWeekNumber = X1.DayWeekNumber

这是结果图像

这个问题的答案并不容易。 它很可能需要一个查找表,提供几年中每个月第一天的工作日。 从那里可以开发剩余的计算。

从这个意义上说,这篇文章不会一个“答案” ,而是一个更长的评论,需要一些格式和一个片段来说明。

在 JavaScript 中玩耍时,我发现了一种相当直接的方法,可以为给定的年份和月份进行这种第 n 个工作日计算(这可用于为您的数据库计算合适的查找表):

 function createDate2(a){ // [2020,3,1,3] = [year,month,weekday, n-th occurence of weekday in month] const d=new Date(a[0],a[1],1); // create first day of the month d.setDate((a[2]-d.getDay()-6)%7 + a[3]*7); // adjust to a[3]-th occurrence of the given weekday a[2] return d } // weekday numbering: 0-Sunday, 1-Monday, 2-Tuesday... 6-Saturday // extend the Date prototype: Date.prototype.getDate2=function(){ return [this.getFullYear(),this.getMonth(),this.getDay(),-~(this.getDate()/7)]; } // returns an array: [year,month,weekday, n-th occurence of weekday in month] // calculate the third Thursday in each month for 2023: for (let d,m=0;m<12;m++) console.log(createDate2([2023,m,4,3]).toLocaleDateString("en-US",{weekday:'long',year:'numeric',month:'long',day:'numeric'}) );

也许它对某人仍然有用? ...例如,提取其中的某些部分以获得基于 SQL 的答案?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM