7

上周五怎么过?

我已经尝试了以下代码,但它不向前也不向后。

SELECT DATE_FORMAT(LAST_DAY(NOW()) - ((7 + WEEKDAY(LAST_DAY(NOW())) - 4) % 7), '%Y-%m-%d') last_friday;

我需要的结果应该是:2013-05-24 而不是 2013-05-31。

请更改我的编码。

4

5 回答 5

9

亲,试试这个:

SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL ((7 + WEEKDAY(DATE_SUB(NOW(), INTERVAL 1 WEEK)) - 4) % 7) DAY), '%Y-%m-%d');
于 2013-05-27T08:34:17.137 回答
9

在 MySQL 中,该WEEKDAY函数返回一个从 0 到 6 的整数:星期一为 0,星期二为 1,等等。如果将该值作为天数并从当前日期中减去它,即如下所示:

NOW() - INTERVAL WEEKDAY(NOW()) DAY

您将始终获得当前 [ISO] 周的星期一。

知道这一点,您只需再减去 3 天即可获得上周的星期五。所以,最终的表达式是这样的:

NOW() - INTERVAL WEEKDAY(NOW()) + 3 DAY

你也可以看看这个 SQL Fiddle 演示

于 2013-05-27T17:27:46.223 回答
1

尝试这个

SELECT date_sub(curdate(), INTERVAL  
CASE weekday(curdate()) -- weekday will give you the index of the day ( 0 = Monday, 1 = Tuesday, 2 = Wednesday, ... 6 = Sunday)  
WHEN 0 THEN 3 -- If Monday then sub 3 days  
WHEN 6 THEN 2 -- If Sunday then sub 2 days  
ELSE 1 -- Else sub 1 day  
END DAY);  
于 2015-06-09T18:45:51.230 回答
1

如果周五你想要上周五,周六你想要昨天

select now() - interval (weekday( now())+ 2)% 7+ 1 day 'Previous Friday';

我也在寻找一种会计解决方案,我需要一个完整的星期五数据。所以如果今天是星期五,那么我需要now()- interval 7 day. 但是,我可能会很兴奋,想在星期六运行查询,并期望now()- interval 1 day. 鉴于此,在我的情况下,间隔应该始终在 1 到 7 之间。我查看了所有以前的答案,但是对我来说,它们并不能完全满足我的需求。这是一个图表,显示每个可能的工作日(0 = 星期一)的每个人的“减法间隔”:

+---------+---------+------+----------+------+-----------+
| weekday |    mine | KaeL | Andriy M | dArc | dquinonez |
+---------+---------+------+----------+------+-----------+
|       0 |       3 |    3 |        3 |    3 |         3 |
|       1 |       4 |    4 |        4 |    4 |         1 |
|       2 |       5 |    5 |        5 |    5 |         1 |
|       3 |       6 |    6 |        6 |    6 |         1 |
|       4 |       7 |    0 |        7 |    7 |         1 |
|       5 |       1 |    1 |        8 |    8 |         1 |
|       6 |       2 |    2 |        9 |    9 |         2 |
+---------+---------+------+----------+------+-----------+

mysql> select i 'weekday',
  (i+ 2)% 7+ 1 'mine',
  ((7+ i- 4)% 7) 'KaeL',
  i+ 3 'Andriy M',
  ((7+ i- 4)% 14) 'dArc',
  case i when 0 then 3 when 6 then 2 else 1 end 'dquinonez'
from (select 0 i union select 1 union select 2 union select 3
  union select 4 union select 5 union select 6 ) q;
  • 当今天是星期五时,“Kael”今天仍然存在(你可能想要那个。)
  • 'Andriy M' 和 'dArc' 在星期六和星期日返回 2 个星期五(如果你不想在周末过去之前查看上星期五,这很好。)'dArc' 也给出了该月的最后一个星期五使用'last_day',原来的帖子正在使用,所以这可能是原来的问题实际上是什么。
  • 'dquinonez' 在周六、周日和周一为我工作——如果我知道我将只在那些日子运行查询,那就太好了。他的方法在填写其他日子时也是最易读的 - 并且最容易针对特殊情况进行修改。
于 2015-06-30T16:20:22.597 回答
0

尝试这个

SELECT DATE_FORMAT(LAST_DAY(NOW()) - ((7 + WEEKDAY(LAST_DAY(NOW())) - 4) % 14), '%Y-%m-%d') last_friday;
于 2013-05-27T08:34:57.600 回答