【问题标题】:How to get the day of month, of the first day of a week, given the year the month and the week in a MariaDb query?给定 MariaDb 查询中的年份和月份,如何获取一周的第一天的月份日期?
【发布时间】:2020-12-08 20:34:14
【问题描述】:

是否可以在给定年、月和周的情况下获得一周的第一个日期的 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

【问题讨论】:

  • “给定月份”是多余的,对,还是我遗漏了什么?在这种情况下,请参阅How to convert number of week into date? 以获取每周星期二的日期。
  • @Solarflare 不幸的是,STR_TO_DATE 似乎有点问题,请阅读我对 indago 的评论。

标签: mysql time calendar mariadb java-time


【解决方案1】:

我确实觉得拥有它的重要性,但我在 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() 按上限函数的结果进行分组。我在EndDate 的年份使用PARTITION 对查询执行了另一个ROW_NUMBER() 函数。除了最重要的事情之外,所有这一切都是选择 1/January = Monday 的第一年;在上面的示例中,2018 年 1 月 1 日是星期一。

【讨论】:

    猜你喜欢
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    相关资源
    最近更新 更多