Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何获得即将到来的星期日&x27;谁的日期?_Mysql - Fatal编程技术网

Mysql 如何获得即将到来的星期日&x27;谁的日期?

Mysql 如何获得即将到来的星期日&x27;谁的日期?,mysql,Mysql,我需要得到“这个星期天”的约会 我怎么能这样做 我已经看到了DAYOFWEEK函数,但这并不是我真正想要的(在WHERE子句中可能有用) 编辑: 我把问题从周六改回了原来的周日,因为周日我得到了一些有效的答案,这可能会对未来的一些人有所帮助 我在其他地方找到了一些“周末”日期问题和答案(包括这里) 对我来说,最有用的解决办法是找到了公认的答案 试试这个 =IIf(Weekday(Now())=1,DateAdd("d",7,Now()), IIf(Weekday(Now())=2,DateAdd

我需要得到“这个星期天”的约会

我怎么能这样做

我已经看到了
DAYOFWEEK
函数,但这并不是我真正想要的(在WHERE子句中可能有用)

编辑:

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

我在其他地方找到了一些“周末”日期问题和答案(包括这里)

对我来说,最有用的解决办法是找到了公认的答案

试试这个

=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()) )))))))

更新

最好使用
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                                    |
+-----------------------------------------------+
+-----------------------------------------------+
| date(@date + INTERVAL 6 - weekday(@date) DAY) |
+-----------------------------------------------+
| 2014-03-09                                    |
+-----------------------------------------------+
说明:

weekday(now())
返回当前工作日(从0开始表示星期一,6表示星期天)。将当前工作日从6中减去,得到下周日之前的剩余天数。然后将它们添加到当前日期,并获得下周日的日期

或者,如果您希望灵活处理任何日期:

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

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

+-----------------------------------------------+
| date(now() + INTERVAL 6 - weekday(now()) DAY) |
+-----------------------------------------------+
| 2014-04-13                                    |
+-----------------------------------------------+
+-----------------------------------------------+
| date(@date + INTERVAL 6 - weekday(@date) DAY) |
+-----------------------------------------------+
| 2014-03-09                                    |
+-----------------------------------------------+
该功能可与一个漂亮的单内衬搭配使用:

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上关于年/周转换的注释中收集的。然后,使用mode参数to WEEK将星期日视为一周的最后一天,而不是第一天。本质上,我们构造了如下字符串:

'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  |
+-------------+

我发布了一个类似的答案,其中对这里所问的问题给出了一个更一般的解决方案。下面的解决方案将帮助您进入任何指定的第二天(星期日、星期一、星期二、星期三、星期四、星期五或星期六),类似于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个案例创建了一个巨大的案例陈述。我发现这使得查询变得超级大而且不干净。我想要一个更干净、更简单的解决方案,比如封闭式公式。下面是详细的计算,我做了确认上述公式的工程。我用MySQL5.7测试了这个功能,如果您使用的是MySQL8.5,它看起来像是内置的(参考:)

注意:Excel不会为模数返回负结果,MySQL会返回负结果。这就是为什么我们加7,再做一个模数


被接受的答案将在上周六周日返回。 如果你需要下周六的周日,请使用此

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

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

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

请注意,周一的工作日指数从0开始。。。。。。6对于星期天

向我们展示您的代码。只是有点迂腐,但星期天是一周的第一天,而不是最后一天。@beercodebeer将星期天视为一周的最后一天受到MySQL的明确支持:请参阅week函数的'mode'参数:谢谢@beercodebeer你说得对,我在星期六之后:)@Adam,我的代码看起来很“外型”,所以我省略了it@Drewdavidweekday(now())返回当前工作日(周一从0开始)。星期六是星期天。所以,我做了6-4天,剩下的几天就到下周日了。是的,我想我是通过把它分解并运行查询的较小部分来了解输出的。谢谢,这正是我想做的(不知道工作日的功能):@KenWhite-你完全正确。我更新了我的答案。@Drewdavid-我再次改进了代码。请参阅我的更新。@Drewdavid-请参阅我回答中的解释:0是星期一,6是星期天,因此您只需将6更改为5作为星期六。但请不要改变你的问题和标题。现在所有的答案都是错误的,因为它们指的是星期天。这看起来不像是有效的MySQL SQL语法。你能解释一下它在MySQL中是如何工作的吗?谢谢