什么是Oracle的NEXT_DAY函数的MySQL替代品?
问题描述:
NEXT_DAY("01-SEP-95","FRIDAY")
返回下周五的日期,但在MySQL中这个函数似乎不会出现。什么是替代方案?什么是Oracle的NEXT_DAY函数的MySQL替代品?
答
在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")
+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 |
+------------+
上述内容尚未经过验证,因为它的“原样”仅仅作为思考的食物。
答
的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
| 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 |
我可以看到这个在线的一些实现,但我同意他们都似乎有点麻烦。我怀疑这里的某个人可以做得更好 - 尽管定制功能的想法也很好。 – Strawberry