我在将ms sql函数转换为mysql时遇到问题。这是ms sql函数代码:
CREATE FUNCTION [crewu2].[isAvailable] (@OwnerID int, @DateFrom Smalldatetime, @DateTo Smalldatetime)
RETURNS bit AS
BEGIN
DECLARE @t bit
IF @DateFrom IS NULL or @DateTo IS NULL
or EXISTS (select DateID
from [client_BlackDates]
where OwnerID=@OwnerID
and ((DateFrom<=@DateFrom and @DateFrom<=DateTo)
or (DateFrom<=@DateTo and @DateTo<=DateTo)))
SET @t=0
ELSE
SET @t=1
RETURN @t
END
这里转换为mysql:
DELIMITER $$
CREATE FUNCTION isAvailable (OwnerID INT, DateFrom DATETIME, DateTo DATETIME)
RETURNS BIT
BEGIN
DECLARE t BIT;
IF DateFrom IS NULL OR DateTo IS NULL
OR EXISTS (SELECT DateID
FROM client_BlackDates
WHERE OwnerID=OwnerID
AND ((DateFrom<=DateFrom AND DateFrom<=DateTo)
OR (DateFrom<=DateTo AND DateTo<=DateTo)))
SET t=0;
ELSE
SET t=1;
RETURN t
END $$
DELIMITER;
但是它给了我以下错误:
Error Code : 1064
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 'SET t=0;
ELSE
SET t=1;
RETURN t
END' at line 6
请有人帮我解决这个问题。
答案 0 :(得分:2)
这应该有用(您错过了THEN
和END IF
):
DELIMITER $$
CREATE FUNCTION isAvailable (OwnerID INT, DateFrom DATETIME, DateTo DATETIME)
RETURNS BIT
BEGIN
DECLARE t BIT;
IF DateFrom IS NULL OR DateTo IS NULL OR EXISTS (SELECT DateID FROM client_BlackDates WHERE OwnerID=OwnerID AND ((DateFrom<=DateFrom AND DateFrom<=DateTo) OR (DateFrom<=DateTo AND DateTo<=DateTo)))
**THEN**
SET t=0;
ELSE
SET t=1;
RETURN t;
**END IF;**
END $$
DELIMITER ;
参考MySQL docs。
答案 1 :(得分:1)
使用IF..THEN..ELSE语法
查看MySQL手册DELIMITER //
CREATE FUNCTION isAvailable (OwnerID INT, DateFrom DATETIME, DateTo DATETIME)
RETURNS BIT
BEGIN
DECLARE t BIT;
IF DateFrom IS NULL OR DateTo IS NULL
OR EXISTS (SELECT DateID
FROM client_BlackDates
WHERE OwnerID=OwnerID
AND ((DateFrom<=DateFrom AND DateFrom<=DateTo)
OR (DateFrom<=DateTo AND DateTo<=DateTo)))
THEN
SET t = 0;
ELSE
SET t = 1;
END IF;
RETURN t;
END //
DELIMITER ;