2017-05-09 16 views
0

NEXT_DAY("01-SEP-95","FRIDAY")返回下週五的日期,但在MySQL中這個函數似乎不會出現。什麼是替代方案?什麼是Oracle的NEXT_DAY函數的MySQL替代品?

+0

我可以看到這個在線的一些實現,但我同意他們都似乎有點麻煩。我懷疑這裏的某個人可以做得更好 - 儘管定製功能的想法也很好。 – Strawberry

回答

0

在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

0

這裏的回答不同的問題:

查找本週週五的日期: -

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

上述內容尚未經過驗證,因爲它的「原樣」僅僅作爲思考的食物。

0

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 |