在MariaDb查询中给定年份和月份,如何获取一周中第一天的月份中的某天?

时间:2020-08-19 14:30:35

标签: mysql time calendar mariadb java-time

给定年,月和周,是否可以获取一周的第一天的DAYOFMONTH?
请注意,一周的第一个日期也可能在上个月,甚至在前一年。

我知道这是可以通过编程实现的,至少可以使用java.time,TemporalFields等。但是我想在sql查询级别上做到这一点,因为当涉及到星期时,该过程涉及两个额外的参数,是被认为是一周中第一天的DayOfWeek,以及一个月内一周中要考虑的一周中的最少天数。如果在sql和api上的配置都不完全相同,则可能导致不同的结果。

使用DayOfMonth.Monday和第一周的最少天数的示例:1,
就sql而言,应为WEEK MariaDb function的模式7。

Given Year: 2020 Given Month: 1 Given Week: 1 Result: 30
Given Year: 2020 Given Month: 1 Given Week: 2 Result: 6
Given Year: 2020 Given Month: 1 Given Week: 3 Result: 13
Given Year: 2020 Given Month: 1 Given Week: 4 Result: 20
Given Year: 2020 Given Month: 1 Given Week: 5 Result: 27
Given Year: 2020 Given Month: 2 Given Week: 5 Result: 27
Given Year: 2020 Given Month: 2 Given Week: 6 Result: 3
Given Year: 2020 Given Month: 2 Given Week: 7 Result: 10
Given Year: 2020 Given Month: 2 Given Week: 8 Result: 17
Given Year: 2020 Given Month: 2 Given Week: 9 Result: 24
Given Year: 2020 Given Month: 3 Given Week: 9 Result: 24
Given Year: 2020 Given Month: 3 Given Week: 10 Result: 2
Given Year: 2020 Given Month: 3 Given Week: 11 Result: 9
Given Year: 2020 Given Month: 3 Given Week: 12 Result: 16
Given Year: 2020 Given Month: 3 Given Week: 13 Result: 23
Given Year: 2020 Given Month: 3 Given Week: 14 Result: 30
Given Year: 2020 Given Month: 4 Given Week: 14 Result: 30
Given Year: 2020 Given Month: 4 Given Week: 15 Result: 6
Given Year: 2020 Given Month: 4 Given Week: 16 Result: 13
Given Year: 2020 Given Month: 4 Given Week: 17 Result: 20
Given Year: 2020 Given Month: 4 Given Week: 18 Result: 27
Given Year: 2020 Given Month: 5 Given Week: 18 Result: 27
Given Year: 2020 Given Month: 5 Given Week: 19 Result: 4
Given Year: 2020 Given Month: 5 Given Week: 20 Result: 11
Given Year: 2020 Given Month: 5 Given Week: 21 Result: 18
Given Year: 2020 Given Month: 5 Given Week: 22 Result: 25
Given Year: 2020 Given Month: 6 Given Week: 23 Result: 1
Given Year: 2020 Given Month: 6 Given Week: 24 Result: 8
Given Year: 2020 Given Month: 6 Given Week: 25 Result: 15
Given Year: 2020 Given Month: 6 Given Week: 26 Result: 22
Given Year: 2020 Given Month: 6 Given Week: 27 Result: 29
Given Year: 2020 Given Month: 7 Given Week: 27 Result: 29
Given Year: 2020 Given Month: 7 Given Week: 28 Result: 6
Given Year: 2020 Given Month: 7 Given Week: 29 Result: 13
Given Year: 2020 Given Month: 7 Given Week: 30 Result: 20
Given Year: 2020 Given Month: 7 Given Week: 31 Result: 27
Given Year: 2020 Given Month: 8 Given Week: 31 Result: 27
Given Year: 2020 Given Month: 8 Given Week: 32 Result: 3
Given Year: 2020 Given Month: 8 Given Week: 33 Result: 10
Given Year: 2020 Given Month: 8 Given Week: 34 Result: 17
Given Year: 2020 Given Month: 8 Given Week: 35 Result: 24
Given Year: 2020 Given Month: 8 Given Week: 36 Result: 31
Given Year: 2020 Given Month: 9 Given Week: 36 Result: 31
Given Year: 2020 Given Month: 9 Given Week: 37 Result: 7
Given Year: 2020 Given Month: 9 Given Week: 38 Result: 14
Given Year: 2020 Given Month: 9 Given Week: 39 Result: 21
Given Year: 2020 Given Month: 9 Given Week: 40 Result: 28
Given Year: 2020 Given Month: 10 Given Week: 40 Result: 28
Given Year: 2020 Given Month: 10 Given Week: 41 Result: 5
Given Year: 2020 Given Month: 10 Given Week: 42 Result: 12
Given Year: 2020 Given Month: 10 Given Week: 43 Result: 19
Given Year: 2020 Given Month: 10 Given Week: 44 Result: 26
Given Year: 2020 Given Month: 11 Given Week: 44 Result: 26
Given Year: 2020 Given Month: 11 Given Week: 45 Result: 2
Given Year: 2020 Given Month: 11 Given Week: 46 Result: 9
Given Year: 2020 Given Month: 11 Given Week: 47 Result: 16
Given Year: 2020 Given Month: 11 Given Week: 48 Result: 23
Given Year: 2020 Given Month: 11 Given Week: 49 Result: 30
Given Year: 2020 Given Month: 12 Given Week: 49 Result: 30
Given Year: 2020 Given Month: 12 Given Week: 50 Result: 7
Given Year: 2020 Given Month: 12 Given Week: 51 Result: 14
Given Year: 2020 Given Month: 12 Given Week: 52 Result: 21
Given Year: 2020 Given Month: 12 Given Week: 53 Result: 28

1 个答案:

答案 0 :(得分:0)

我确实感到拥有此功能的重要性,但是我没有找到可以直接使用的MySQL / MariaDB内置函数(例如WEEK()等,如果有的话)。就我而言,我正在使用自定义查询来生成星期数,到目前为止,下面的查询一直在返回正确的星期数:

SELECT mnd AS 'StartDate', 
       mxd AS 'EndDate', 
       ROW_NUMBER() OVER (PARTITION BY  YEAR(mxd) ORDER BY mnd) AS 'WeekNo' 
FROM
(SELECT MIN(dt) AS mnd,MAX(dt) AS mxd, nom FROM
 (SELECT dt, num , CEIL(num/7) AS nom FROM
  (SELECT DATE_FORMAT(CONCAT_WS('-',yr,mnt,dy),'%Y-%m-%d') AS dt, 
          ROW_NUMBER() OVER (ORDER BY dt) AS num 
      FROM
      /*Query to generate date in MariaDB*/
      (SELECT LPAD(seq,2,0) AS dy FROM seq_1_to_31) a,
      (SELECT LPAD(seq,2,0) AS mnt FROM seq_1_to_12) b,
      (SELECT seq AS yr FROM seq_2018_to_2023) c
      /*-------------------------*/
HAVING dt IS NOT NULL ORDER BY dt) V ) W 
GROUP BY nom) Q;

Demo fiddle here

我首先在子查询中做了ROW_NUMBER(),然后使用该结果除以上限函数(CEIL())除以7(每周7天)。然后再进行一次查询,以将上限函数的结果与日期上的MIN()MAX()进行分组。我对ROW_NUMBER()年份的PARTITION进行了另一个EndDate函数查询。除了最重要的事情之外,所有其他事情都是选择第一年1月1日=星期一;在上面的示例中,01/01/2018是星期一。

相关问题