1

(解決策については、以下の私の回答を参照してください-フィードバックに感謝します)

それはおそらく本当に明白なことですが、私の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)

(NBさまざまなレベルで日付を切り捨てる他の方法があるかもしれません-そして私は確かにそれらについて聞くことに興味があります、私は本当に私の構文の何が悪いのか知りたいです-期間の始まりを計算するための別の方法ではありません) 。

はい、second()は有効な関数であり、SECONDは有効な間隔です。

TIA

4

4 に答える 4

1

タイプに腹を立てていることはすでに考えていましたが、すべての「date」タイプを「DATETIME」タイプに置き換えても問題は解決しませんでした-問題は「SUBDATE」と「(」の間のスペースでした-私は決してMySQLがそのようなことについてうるさいことを知っていました!

(私はこれを回答としてフラグを立てますが、SOは最初に数日待つことを望んでいます)

于 2011-01-17T14:41:35.900 に答える
1

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)
于 2011-01-17T14:43:02.520 に答える
0

問題は、関数が代わりにsecond()取り込むためですtimedate

多分このように

second( cast(curdate as time) )

しかし

のサブ日付のために意味がなくa given date to seconds、日付形式で返されます(これはまだ日付です)

于 2011-01-17T14:20:54.597 に答える
0

DATEではなくDATETIMEデータ型を使用しないでください。

于 2011-01-17T14:21:08.180 に答える