【问题标题】:Struggling to see the error of my ways (mysql function)努力看到我的方式的错误(mysql函数)
【发布时间】:2011-01-17 14:04:18
【问题描述】:

(请参阅下面的答案以获取解决方案 - 感谢您的反馈)

这可能很明显,但我看不出我的 sql 有什么问题:

mysql> CREATE FUNCTION start_of_minute(
->     curdate DATE)
->   RETURNS DATE
->   DETERMINISTIC
->   SQL SECURITY INVOKER
->   BEGIN
->     DECLARE sofm DATE;
->     SET sofm = SUBDATE (
->         curdate,
->         INTERVAL SECOND(curdate) SECOND
->       );
->   RETURN sofm;
->   END //
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that 
corresponds to your MySQL server version for the right syntax to use near ');
RETURN sofm;
END' at line 11

下面的作品更令人沮丧:

mysql> CREATE FUNCTION start_of_week(
->     curdate DATE,
-> first_day_of_week INTEGER)
->    RETURNS DATE
->    DETERMINISTIC
->    SQL SECURITY INVOKER
->    BEGIN
->       DECLARE sow DATE;
->       SET sow = SUBDATE(
->         curdate,
->         INTERVAL (WEEKDAY(curdate)+(7-first_day_of_week)%7) DAY
->         );
->       RETURN sow;
->    END //
Query OK, 0 rows affected (0.00 sec)

(注意可能还有其他方法可以在各个级别截断日期 - 我当然有兴趣了解它们,我真的很想知道我的语法有什么问题 - 不是计算开始的不同方法句号)。

是的,second() is a valid functionSECOND is a valid interval

TIA

【问题讨论】:

  • 您是要标记这个 DB2 吗?
  • 是的 - mysql 应该与 DB2 的语法兼容(尽管两者都有一些不共同的特定功能)。使用过程式 mysql 的人还不多。

标签: sql mysql db2 stored-functions


【解决方案1】:

我已经考虑过它对类型感到不安 - 但是用 'DATETIME' 类型替换所有 'date' 类型并不能解决问题 - 结果问题是 'SUBDATE' 和 '(' 之间的空格- 我从来不知道 MySQL 对这些事情很挑剔!

(我会将此标记为错误,但我希望我先等几天)

【讨论】:

    【解决方案2】:

    curdate 是保留字:

    drop function if exists start_of_minute;
    
    delimiter #
    
    create function start_of_minute
    (
    p_curdate datetime
    )
    returns datetime
    begin
    declare sofm datetime;
      set sofm = subdate(p_curdate, interval second(p_curdate) second);
      return sofm;
    end#
    
    delimiter;
    select now(), start_of_minute(now());
    

    编辑

    mysql> select curdate();
    +------------+
    | curdate()  |
    +------------+
    | 2011-01-17 |
    +------------+
    1 row in set (0.00 sec)
    

    【讨论】:

    • CURRENT_DATE 是保留关键字,而不是curdate?
    【解决方案3】:

    问题是因为函数second() 接受time 而不是date

    可能是这样的

    second( cast(curdate as time) )
    

    但是

    由于a given date to seconds 的子日期没有意义,并以日期格式返回(仍然是日期)

    【讨论】:

      【解决方案4】:

      您不应该使用 DATETIME 数据类型而不是 DATE 吗?

      【讨论】:

        猜你喜欢
        • 2014-01-05
        • 1970-01-01
        • 1970-01-01
        • 2015-01-20
        • 1970-01-01
        • 2020-09-21
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多