我想堅持這個領域,但無法弄清楚為什么它是非確定性的。
CREATE FUNCTION GetServiceMinutes
(
-- Add the parameters for the function here
@StartDate datetime,
@EndDate datetime
)
RETURNS int WITH SCHEMABINDING
AS
BEGIN
DECLARE @Result int
SET @StartDate = CASE WHEN DATEPART(HOUR, @StartDate) < 8 THEN DATEADD(DAY, DATEDIFF(DAY, 0, @StartDate), '08:00:00') ELSE @StartDate END
SET @EndDate = CASE WHEN DATEPART(HOUR, @EndDate) >= 17 THEN DATEADD(DAY, DATEDIFF(DAY, 0, @EndDate), '17:00:00') ELSE @EndDate END
SET @Result =
CASE WHEN DATEPART(DAY, @StartDate) != DATEPART(DAY, @EndDate) THEN 1000
WHEN DATEPART(HOUR, @EndDate) < 8 THEN 0
WHEN DATEPART(HOUR, @StartDate) >= 17 THEN 0
ELSE DATEDIFF(MINUTE, @StartDate, @EndDate)
END
RETURN @Result
END
GO
這將回傳 0
SELECT OBJECTPROPERTY(OBJECT_ID('[dbo].GetServiceMinutes'), 'IsDeterministic')
使用 SQL Server 2017
uj5u.com熱心網友回復:
正如我所提到的,問題是您對(日期和)時間值的隱式轉換。根據檔案:
以下函式并不總是確定性的,但當它們以確定性方式指定時,可以在索引視圖或計算列的索引中使用。
功能 評論 所有聚合函式 所有聚合函式都是確定性的,除非它們是用 OVER 和 ORDER BY 子句指定的。有關這些函式的串列,請參閱聚合函式 (Transact-SQL)。 投擲 確定性,除非與 datetime、smalldatetime 或 sql_variant 一起使用。 兌換 確定性,除非存在以下條件之一:
源型別為 sql_variant。
目標型別是 sql_variant,其源型別是不確定的。
源或目標型別為 datetime 或 smalldatetime,另一個源或目標型別為字串,并指定了不確定的樣式。要確定性,樣式引數必須是常量。此外,小于或等于 100 的樣式是不確定的,但樣式 20 和 21 除外。大于 100 的樣式是確定的,但樣式 106、107、109 和 113 除外。
在您的函式中,您有隱式轉換,例如'08:00:00'到datetime. 你需要明確:
CREATE FUNCTION dbo.GetServiceMinutes
(
-- Add the parameters for the function here
@StartDate datetime,
@EndDate datetime
)
RETURNS int WITH SCHEMABINDING
AS
BEGIN
DECLARE @Result int
SET @StartDate = CASE WHEN DATEPART(HOUR, @StartDate) < 8 THEN DATEADD(DAY, DATEDIFF(DAY, 0, @StartDate), CONVERT(datetime,'1900-01-01T08:00:00',126)) ELSE @StartDate END
SET @EndDate = CASE WHEN DATEPART(HOUR, @EndDate) >= 17 THEN DATEADD(DAY, DATEDIFF(DAY, 0, @EndDate), CONVERT(datetime,'1900-01-01T17:00:00',126)) ELSE @EndDate END
SET @Result =
CASE WHEN DATEPART(DAY, @StartDate) != DATEPART(DAY, @EndDate) THEN 1000
WHEN DATEPART(HOUR, @EndDate) < 8 THEN 0
WHEN DATEPART(HOUR, @StartDate) >= 17 THEN 0
ELSE DATEDIFF(MINUTE, @StartDate, @EndDate)
END
RETURN @Result
END
GO
SELECT OBJECTPROPERTY(OBJECT_ID('[dbo].GetServiceMinutes'), 'IsDeterministic')
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/381074.html
標籤:sql-server 查询语句 不确定的
上一篇:拆分一列并獲取所有計算出的行
