2017-05-09 11 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

これは、inbuilt関数が結果を得るためにあることを意味しますか? –

+0

@Madhivanan - 私はMySQLの人ではありませんが、単にADDDATE(開始、7)をしないと、昼の名前が同じ場合、我々は良いです。ループは少し上にあるようです。確かに、それは私が使ったことではないので、私は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 | 
関連する問題