如何实现周日的约会?

时间:2014-04-11 18:34:21

标签: mysql

我需要得到“即将到来的星期天”的日期

我怎么能这样做?

我已经看到了DAYOFWEEK函数,但这并不是我所追求的(在WHERE子句中可能有用)

编辑:

我将问题从星期六的更改改回原来的星期日,因为我得到了星期天的一些有效答案,这可能会对未来的某些人有所帮助

我在其他地方找到了许多其他“周末”日期问题和答案(包括此处的SO)

对我来说,最有用的解决方案是找到的here答案。

6 个答案:

答案 0 :(得分:8)

<强>更新

最好使用curdate()代替now(),因此可以省略通过DATE进行date()类型的最终转换。

SELECT curdate() + INTERVAL 6 - weekday(curdate()) DAY;

下周日或

SET @date = '2014-03-05';

SELECT @date + INTERVAL 6 - weekday(@date) DAY;

表示可变日期。


原始回答

只需在下一个星期天使用此声明:

SELECT date(now() + INTERVAL 6 - weekday(now()) DAY);

<强>输出

+-----------------------------------------------+
| date(now() + INTERVAL 6 - weekday(now()) DAY) |
+-----------------------------------------------+
| 2014-04-13                                    |
+-----------------------------------------------+

<强>解释

weekday(now())返回当前的工作日(星期一为0,星期日为6)。从6减去当前的工作日,并得到剩余的天数,直到下一个星期日为止。然后将它们添加到当前日期并获得下一个星期日的日期。

或者,如果您希望保持灵活性以适应任何日期:

SET @date = '2014-03-05';

SELECT date(@date + INTERVAL 6 - weekday(@date) DAY);

<强>输出

+-----------------------------------------------+
| date(@date + INTERVAL 6 - weekday(@date) DAY) |
+-----------------------------------------------+
| 2014-03-09                                    |
+-----------------------------------------------+

答案 1 :(得分:0)

Date()+8-WeekDay(Date()) 

并试试这个

=IIf(Weekday(Now())=1,DateAdd("d",7,Now()),
IIf(Weekday(Now())=2,DateAdd("d",6,Now()),
IIf(Weekday(Now())=3,DateAdd("d",5,Now()),
IIf(Weekday(Now())=4,DateAdd("d",4,Now()),
IIf(Weekday(Now())=5,DateAdd("d",3,Now()),
IIf(Weekday(Now())=6,DateAdd("d",2,Now()), 
IIf(Weekday(Now())=6,DateAdd("d",1,Now()) )))))))

答案 2 :(得分:0)

WEEK函数可以与STR_TO_DATE配对,以获得更好的单行:

SELECT STR_TO_DATE(CONCAT(YEAR(NOW()),WEEK(NOW(),1), ' Sunday'), '%X%V %W') as `this Sunday`;
+-------------+
| this Sunday |
+-------------+
| 2014-04-13  |
+-------------+;

如果您按照文档链接进行操作,则总体策略主要是从STR_TO_DATE关于年/周转换的说明中收集的。然后使用WEEK的mode参数将星期日视为最后一个而不是一周的第一天。基本上,我们构造一个这样的字符串:

'201415 Sunday'

这将被解释为“在2014年,第15周的星期日”。

以防万一,我在年界测试了这个...到目前为止看起来还不错!

SELECT STR_TO_DATE(CONCAT(YEAR('2014-12-31'),WEEK('2014-12-31',1), ' Sunday'), '%X%V %W') as `this Sunday`;
+-------------+
| this Sunday |
+-------------+
| 2015-01-04  |
+-------------+

答案 3 :(得分:0)

我在What is the MySQL alternative to Oracle's NEXT_DAY function?中发布了类似的答案,它是对此处提出的问题的更一般的解决方案。下方的解决方案将帮助您到达第二天的任何指定日期(星期日,星期一,星期二,星期三,星期四,星期五或星期六),类似于oracle中的NEXT_DAY()函数。

简短版本:

利用DAYOFWEEK(),您可以利用数字值创建一个封闭的公式,该公式告诉您要添加多少天。然后,您可以利用DATE_ADD帮助您更改日期。可能有一种更简洁的方法,但是您应该可以利用此功能。

以下是一个Excel公式,可用于验证所有49个用例:=MOD(MOD(Next-Input, 7)+7,7)

一些如何将excel计算转换为SQL的示例:

SELECT (((1-DAYOFWEEK('2018-08-15')) % 7)+7) % 7 AS DaysToAddToGetNextSundayFromWednesday 
FROM dual; -- 4

SELECT DATE_ADD('2018-08-15', INTERVAL (((1-DAYOFWEEK('2018-08-15')) % 7)+7) % 7 DAY) AS NextSundayFromDate 
FROM dual; -- 2018-08-19   

如果您打算经常使用以上内容,则可能需要创建一个函数或存储过程。

长版:

这些年来,我多次遇到这个问题。第一次,我为所有49个案例创建了一个大型案例声明。我发现这使查询变得超大且不干净。我想要一个更清洁,更简单的解决方案,例如封闭式公式。以下是我为确认上述公式所做的计算的详细信息。我使用MySQL 5.7进行了测试,如果您使用的是MySQL 8.5,则该函数似乎是内置的(参考:http://www.sqlines.com/mysql/how-to/next_day)。

注意:Excel不会像MySQL那样返回模数的负结果。这就是为什么我们加7并做另一个模数的原因。

DAYOFWEEK()         
Sun     1       
Mon     2       
Tues    3       
Wed     4       
Thur    5       
Fri     6       
Sat     7       

Input   Next    Expected Days to Add    Formula Result
1       1       0                       0
1       2       1                       1
1       3       2                       2
1       4       3                       3
1       5       4                       4
1       6       5                       5
1       7       6                       6
2       1       6                       6
2       2       0                       0
2       3       1                       1
2       4       2                       2
2       5       3                       3
2       6       4                       4
2       7       5                       5
3       1       5                       5
3       2       6                       6
3       3       0                       0
3       4       1                       1
3       5       2                       2
3       6       3                       3
3       7       4                       4
4       1       4                       4
4       2       5                       5
4       3       6                       6
4       4       0                       0
4       5       1                       1
4       6       2                       2
4       7       3                       3
5       1       3                       3
5       2       4                       4
5       3       5                       5
5       4       6                       6
5       5       0                       0
5       6       1                       1
5       7       2                       2
6       1       2                       2
6       2       3                       3
6       3       4                       4
6       4       5                       5
6       5       6                       6
6       6       0                       0
6       7       1                       1
7       1       1                       1
7       2       2                       2
7       3       3                       3
7       4       4                       4
7       5       5                       5
7       6       6                       6
7       7       0                       0

答案 4 :(得分:0)

接受的答案将在星期日的上一个星期六返回。 如果您需要星期日的下一个星期六,请使用此

SELECT 
CAST(
  Case When weekday(now()) = 6 Then (now() + INTERVAL weekday(now()) DAY)
    else (now() +  INTERVAL 5 - weekday(now()) DAY)
  end 
As Date) as saturday

答案 5 :(得分:0)

要查找给定工作日的下一个日期,请使用此查询。在 THEDAY 变量中设置所需的星期几。

    SET @THEDAY = 1;
SELECT DATE_ADD(NOW(), INTERVAL if( @THEDAY > WEEKDAY(NOW()) , (@THEDAY - WEEKDAY(NOW())) ,  (7 - WEEKDAY(NOW())) + @THEDAY) DAY)

请注意,工作日索引从0开始于星期一...... 6从星期日开始