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