我需要得到“即将到来的星期天”的日期
我怎么能这样做?
我已经看到了DAYOFWEEK
函数,但这并不是我所追求的(在WHERE子句中可能有用)
编辑:
我将问题从星期六的更改改回原来的星期日,因为我得到了星期天的一些有效答案,这可能会对未来的某些人有所帮助
我在其他地方找到了许多其他“周末”日期问题和答案(包括此处的SO)
对我来说,最有用的解决方案是找到的here答案。
答案 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从星期日开始