【问题标题】:MYSQL Get week of the month starting from Saturday with leading zerosMYSQL 获取从星期六开始的月份中的第几周,前导零
【发布时间】:2020-10-15 17:47:41
【问题描述】:

我有一个非常复杂的查询需要帮助。 我有一个包含Order_ID、Date 和Day 的表。

我需要得到每月的星期Week_No。该字段有 4 个关键条件。

  1. 一周从星期六开始,在每个月初重新开始。
  2. 结果的总长度应为 3 个字符,因此应始终有 2 个前导零,例如001。
  3. Week_No 将始终从 001 开始,即使没有其他条目导致该条目的特定 Date。
  4. Week_No 始终以 1 递增,即使在该月的某个特定周内没有订单。

以条件 3. 和 4. 为例,

如果 6 月份只有 2 个订单,2020-06-29 上的一个和2020-06-11 上的一个,Week_No 将分别为前者和后者的 002 和 001。

希望我下面的表格足够清楚。

╔══════════╦════════════╦═════╦═════════╗
║ Order_ID ║    Date    ║ Day ║ Week_No ║
╠══════════╬════════════╬═════╬═════════╣
║       11 ║ 2020-06-25 ║ Thu ║     002 ║
║       10 ║ 2020-06-24 ║ Wed ║     002 ║
║        9 ║ 2020-06-20 ║ Sat ║     002 ║
║        8 ║ 2020-06-11 ║ Thu ║     001 ║
║        7 ║ 2020-05-31 ║ Sun ║     006 ║
║        6 ║ 2020-05-31 ║ Sun ║     006 ║
║        5 ║ 2020-05-29 ║ Fri ║     005 ║
║        4 ║ 2020-05-20 ║ Wed ║     004 ║
║        3 ║ 2020-05-14 ║ Thu ║     003 ║
║        2 ║ 2020-05-07 ║ Thu ║     002 ║
║        1 ║ 2020-05-01 ║ Fri ║     001 ║
╚══════════╩════════════╩═════╩═════════╝

【问题讨论】:

  • 我建议您创建一个日历表,其中定义了您的周数。这对这样的问题很有用。

标签: mysql sql date conditional-statements


【解决方案1】:

嗯。 . .您实际上可以使用铅和累积总和来做到这一点。逻辑基本上是:

  • 如果上一个日期在同一个月并且中间有星期六,则加 1
  • 当月的第一个日期从 1 开始。

逻辑如下:

  select t.*,
         sum(case when extract(year_month from date) <> extract(year_month from prev_date) or prev_date is null
                  then 1
                  when datediff(date, prev_date) >= 7
                  then 1
                  when day = 'Fri' or
                       day = 'Thu' and prev_day not in ('Fri') or
                       day = 'Wed' and prev_day not in ('Fri', 'Thu') or
                       day = 'Tue' and prev_day not in ('Fri', 'Thu', 'Wed') or
                       day = 'Mon' and prev_day not in ('Fri', 'Thu', 'Wed', 'Tue') or
                       day = 'Sun' and prev_day not in ('Fri', 'Thu', 'Wed', 'Tue', 'Mon') 
                  then 0
                  else 1
             end) over (order by date) as week_num

  from (select t.*,
               lag(date) over (order by date) as prev_date,
               lag(day) over (order by day) as prev_day
        from t
       ) t

【讨论】:

  • 我怎样才能获得 prev_date?
  • @MrSoLoDoLo 。 . .我不明白。正如查询所用的那样,它实际上在结果集中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多