【发布时间】:2020-11-04 21:09:15
【问题描述】:
我有以下函数“TicksToDateTime”
CREATE FUNCTION [dbo].[TicksToDateTime] (@t bigint)
RETURNS datetime
WITH SCHEMABINDING
AS
-- converts the given datetime to .NET-compatible ticks
-- see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdatetimeclasstickstopic.asp
BEGIN
declare @result datetime
if (@t=0)
set @result = null
else
if (@t < 552877919999983334)
set @result = cast ('1753-1-1' as datetime)
else
if (@t=3155378975999999999)
set @result = cast ('9999-12-1' as datetime)
else
set @result = CAST((@t - 599266080000000000) / 10000000 / 24 / 60 / 60 AS datetime)
return @result
END
GO
并在表的计算列中使用它:
[CallDateRaw] BIGINT NOT NULL,
[CallDate] AS ([dbo].[TicksToDateTime]([CallDateRaw])),
我现在尝试像这样索引“CallDate”列:
Create Index ExternalCalls_CallDate2 ON [External.Call] (CallDate)
GO
但索引失败,因为该列是“非确定性的”,我可以确认该函数也是非确定性的:
select object_id('tickstodatetime')
select OBJECTPROPERTYEX(2127346643, 'IsDeterministic')
返回 false..
所以我的问题是为什么这个函数是“非确定性的”,我如何使它成为确定性的?从我在互联网上阅读的内容来看,它只是说添加“With SchemaBinding”,但正如您所见,我已经添加了它,但它仍然不起作用。
我做错了什么?
【问题讨论】:
-
尝试使用标准 SQL 日期常量
'17530101'。 -
@GordonLinoff 我应该在哪里使用 SQL 日期常量?
-
使用
CAST到/从日期和时间数据类型是不确定的。 -
@Larnu 谢谢你提供了更多信息,所以是否将所有
Casts更改为Converts? -
我现在正在写一个更具体的答案。
标签: sql sql-server function calculated-columns sql-function