什么是Oracle的NEXT_DAY函数的MySQL替代品?

问题描述:

NEXT_DAY("01-SEP-95","FRIDAY")返回下周五的日期,但在MySQL中这个函数似乎不会出现。什么是替代方案?什么是Oracle的NEXT_DAY函数的MySQL替代品?

+0

我可以看到这个在线的一些实现,但我同意他们都似乎有点麻烦。我怀疑这里的某个人可以做得更好 - 尽管定制功能的想法也很好。 – Strawberry

在MySQL中,您可以创建用户定义的函数

DELIMITER // 
  
    CREATE FUNCTION next_day(start_date DATETIME, weekday CHAR(20)) 
    RETURNS DATETIME 
    BEGIN 
    DECLARE start DATETIME; 
    DECLARE i INT; 
  
    // Select the next date 
    SET start = ADDDATE(start_date, 1); 
    SET i = 1; 
  
    days: LOOP 
      -- Compare the day names 
     IF SUBSTR(DAYNAME(start), 1, 3) = SUBSTR(weekday, 1, 3) THEN  
     LEAVE days; 
     END IF; 
  
     // Select the next date 
     SET start = ADDDATE(start, 1); 
     SET i = i + 1; 
  
     -- Not valid weekday specified 
     IF i > 7 THEN 
     SET start = NULL; 
     LEAVE days; 
    END IF; 
  
    END LOOP days; 
  
    RETURN start; 
    END; 
    // 
  
    DELIMITER ; 

,并调用它

SELECT NEXT_DAY("1995-09-01","FRIDAY") 

来源:http://www.sqlines.com/mysql/how-to/next_day

+0

那意味着没有内置函数可以得到结果吗? –

+0

@Madhivanan - 我不是MySQL的人,但为什么不只是做ADDDATE(开始,7),如果dayname是相同的,那么我们就很好。循环看起来有点过分了。无可否认,我可能错过了一个MySQL技巧,因为这不是我用过的。 – BriteSponge

这里的回答不同的问题:

查找本周周五的日期: -

SELECT STR_TO_DATE(CONCAT('2017',(SELECT DATE_FORMAT(CURDATE(),'%U')),' Friday'),'%Y %U %W') x; 
+------------+ 
| x   | 
+------------+ 
| 2017-05-12 | 
+------------+ 

上述内容尚未经过验证,因为它的“原样”仅仅作为思考的食物。

SQL Fiddle

的MySQL 5.6架构设置

CREATE TABLE your_table (value DATE); 

INSERT INTO your_table (value) 
    SELECT DATE '2017-05-08' FROM DUAL UNION ALL 
    SELECT DATE '2017-05-09' FROM DUAL UNION ALL 
    SELECT DATE '2017-05-10' FROM DUAL UNION ALL 
    SELECT DATE '2017-05-11' FROM DUAL UNION ALL 
    SELECT DATE '2017-05-12' FROM DUAL UNION ALL 
    SELECT DATE '2017-05-13' FROM DUAL UNION ALL 
    SELECT DATE '2017-05-14' FROM DUAL; 

查询1

SELECT value, 
     ADDDATE(
     value, 
     6 - DAYOFWEEK(value) 
      + CASE WHEN DAYOFWEEK(value) < 6 THEN 0 ELSE 7 END 
     ) AS next_friday 
FROM your_table 

Results

|     value |   next_friday | 
|-----------------------|-----------------------| 
| May, 08 2017 00:00:00 | May, 12 2017 00:00:00 | 
| May, 09 2017 00:00:00 | May, 12 2017 00:00:00 | 
| May, 10 2017 00:00:00 | May, 12 2017 00:00:00 | 
| May, 11 2017 00:00:00 | May, 12 2017 00:00:00 | 
| May, 12 2017 00:00:00 | May, 19 2017 00:00:00 | 
| May, 13 2017 00:00:00 | May, 19 2017 00:00:00 | 
| May, 14 2017 00:00:00 | May, 19 2017 00:00:00 |