如何按星期的方式将’23年2月’与’22年2月’相匹配

huangapple go评论81阅读模式
英文:

how can I join february '23 with february '22 by day of the week

问题

以下是翻译的内容,已去掉代码部分:

我正在思考一个优雅的解决方案,将2023年2月与2022年2月相匹配。

使用PHP,我发现2023年2月的第一天是星期三,2022年2月的第一个星期三是2022年2月2日,我想按星期几将它们匹配,结果如下所示:

2023 年表格:
日期 星期几 人数
2023-02-01 星期三 4
2023-02-02 星期四 17
2023-02-03 星期五 4
2023-02-04 星期六 0
2023-02-05 星期日 22
2023-02-06 星期一 33
2023-02-07 星期二 12
2023-02-08 星期三 3
...
2023-02-28 星期二 45

2022 年表格:
日期 星期几 人数
2022-02-01 星期二 14
2022-02-02 星期三 19
2022-02-03 星期四 12
2022-02-04 星期五 18
2022-02-05 星期六 14
2022-02-06 星期日 19
2022-02-07 星期一 0
2022-02-08 星期二 7
2022-02-09 星期三 9
...
2022-02-28 星期一 8

期望的结果:
日期 星期几 2023 2022
2023-02-01 星期三 4 19
2023-02-02 星期四 17 12
2023-02-03 星期五 4 18
2023-02-04 星期六 0 14
2023-02-05 星期日 22 19
2023-02-06 星期一 33 0
2023-02-07 星期二 12 7
2023-02-08 星期三 3 9
...
2023-02-28 星期二 45

这是我想出来的解决方法,现在它运行得很好。但我一直在思考是否有更好的方法来实现这一点。

英文:

Im braking my head of an elegant solution to join feb '23 with feb '22.

With php I'm gettin that the first day of feb '23 as wednesday and the first wednesday of feb '22 was the 2022-02-02, I would like to join them by day of the week to something like this.

  1. 2023 table:
  2. date dayoftheweek people
  3. 2023-02-01 Wednesday 4
  4. 2023-02-02 Thursday 17
  5. 2023-02-03 Friday 4
  6. 2023-02-04 Saturday 0
  7. 2023-02-05 Sunday 22
  8. 2023-02-06 Monday 33
  9. 2023-02-07 Tuesday 12
  10. 2023-02-08 Wednesday 3
  11. 2023-02-28 Tuesday 45
  12. 2022 table:
  13. date dayoftheweek people
  14. 2022-02-01 Tuesday 14
  15. 2022-02-02 Wednesday 19
  16. 2022-02-03 Thursday 12
  17. 2022-02-04 Friday 18
  18. 2022-02-05 Saturday 14
  19. 2022-02-06 Sunday 19
  20. 2022-02-07 Monday 0
  21. 2022-02-08 Tuesday 7
  22. 2022-02-09 Wednesday 9
  23. 2022-02-28 Monday 8
  24. desired result:
  25. date dayofthweek 2023 2022
  26. 2023-02-01 Wednesday 4 19
  27. 2023-02-02 Thursday 17 12
  28. 2023-02-03 Friday 4 18
  29. 2023-02-04 Saturday 0 14
  30. 2023-02-05 Sunday 22 19
  31. 2023-02-06 Monday 33 0
  32. 2023-02-07 Tuesday 12 7
  33. 2023-02-08 Wednesday 3 9
  34. 2023-02-28 Tuesday 45

this is what I came up with and its working fine now:

  1. SET @mon_last_year:= 0;
  2. SET @tue_last_year:= 0;
  3. SET @wed_last_year:= 0;
  4. SET @thu_last_year:= 0;
  5. SET @fri_last_year:= 0;
  6. SET @sat_last_year:= 0;
  7. SET @sun_last_year:= 0;
  8. SET @mon_this_year:= 0;
  9. SET @tue_this_year:= 0;
  10. SET @wed_this_year:= 0;
  11. SET @thu_this_year:= 0;
  12. SET @fri_this_year:= 0;
  13. SET @sat_this_year:= 0;
  14. SET @sun_this_year:= 0;
  15. SELECT
  16. fecha2023,
  17. day_name_count_this_year,
  18. fecha2022,
  19. day_name_count_last_year,
  20. total_this_year,
  21. total_last_year
  22. FROM
  23. (
  24. SELECT
  25. fecha AS 'fecha2023',
  26. CONCAT(day_name,day_count) AS day_name_count_this_year,
  27. total AS total_this_year
  28. FROM
  29. (
  30. SELECT
  31. fecha,
  32. DATE_FORMAT(fecha,'%W') AS day_name,
  33. CASE
  34. WHEN DAYOFWEEK(fecha) = 1 THEN @sun_this_year:= @sun_this_year+1
  35. WHEN DAYOFWEEK(fecha) = 2 THEN @mon_this_year:= @mon_this_year+1
  36. WHEN DAYOFWEEK(fecha) = 3 THEN @tue_this_year:= @tue_this_year+1
  37. WHEN DAYOFWEEK(fecha) = 4 THEN @wed_this_year:= @wed_this_year+1
  38. WHEN DAYOFWEEK(fecha) = 5 THEN @thu_this_year:= @thu_this_year+1
  39. WHEN DAYOFWEEK(fecha) = 6 THEN @fri_this_year:= @fri_this_year+1
  40. WHEN DAYOFWEEK(fecha) = 7 THEN @sat_this_year:= @sat_this_year+1
  41. END AS day_count,
  42. total
  43. FROM
  44. (
  45. SELECT
  46. fecha,
  47. SUM(total_gasto) AS total
  48. FROM
  49. gastos
  50. WHERE
  51. fecha >= '2023-02-01'
  52. AND
  53. fecha <= '2023-02-28'
  54. GROUP BY fecha
  55. ) ty_
  56. ) ty_
  57. ) ty_
  58. LEFT JOIN
  59. (
  60. SELECT
  61. fecha AS 'fecha2022',
  62. CONCAT(day_name,day_count) AS day_name_count_last_year,
  63. total AS total_last_year
  64. FROM
  65. (
  66. SELECT
  67. fecha,
  68. DATE_FORMAT(fecha,'%W') AS day_name,
  69. CASE
  70. WHEN DAYOFWEEK(fecha) = 1 THEN @sun_last_year:= @sun_last_year+1
  71. WHEN DAYOFWEEK(fecha) = 2 THEN @mon_last_year:= @mon_last_year+1
  72. WHEN DAYOFWEEK(fecha) = 3 THEN @tue_last_year:= @tue_last_year+1
  73. WHEN DAYOFWEEK(fecha) = 4 THEN @wed_last_year:= @wed_last_year+1
  74. WHEN DAYOFWEEK(fecha) = 5 THEN @thu_last_year:= @thu_last_year+1
  75. WHEN DAYOFWEEK(fecha) = 6 THEN @fri_last_year:= @fri_last_year+1
  76. WHEN DAYOFWEEK(fecha) = 7 THEN @sat_last_year:= @sat_last_year+1
  77. END AS day_count,
  78. total
  79. FROM
  80. (
  81. SELECT
  82. fecha,
  83. SUM(total_gasto) AS total
  84. FROM
  85. gastos
  86. WHERE
  87. fecha >= '2022-02-01'
  88. AND
  89. fecha <= '2022-02-28'
  90. GROUP BY fecha
  91. ) ly_
  92. ) ly_
  93. ) ly_
  94. ON(day_name_count_this_year = day_name_count_last_year)

its returning the desired result really fast but I keep wondering if theres a better way to achieve this.

如何按星期的方式将’23年2月’与’22年2月’相匹配

答案1

得分: 1

"First Friday" 中某个月的日期将满足 DAYOFMONTH(date) % 7 = 0

因此

  1. 选择...
  2. fecha2022 中选择
  3. 加入 fecha2023
  4. DAYOFWEEK(fecha2023.data)
  5. = DAYOFWEEK(fecha2022.data)
  6. DAYOFMONTH(fecha2023.data) MOD 7
  7. = DAYOFMONTH(fecha2022.data) MOD 7
  8. 其中...

不需要任何 CASE 表达式。

英文:

The "First Friday" of some month will have a DAYOFMONTH(date) % 7 = 0.

So

  1. SELECT ...
  2. FROM fecha2022
  3. JOIN fecha2023
  4. ON DAYOFWEEK(fecha2023.data)
  5. = DAYOFWEEK(fecha2022.data)
  6. AND DAYOFMONTH(fecha2023.data) MOD 7
  7. = DAYOFMONTH(fecha2022.data) MOD 7
  8. WHERE ...

No need for any CASE expression.

huangapple
  • 本文由 发表于 2023年2月10日 12:42:33
  • 转载请务必保留本文链接:https://go.coder-hub.com/75407036.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定