1

SQL 服务器 2008 r2

我正在尝试创建索引视图,但是出现以下错误

无法在视图 '' 上创建索引,因为视图使用从字符串到日期时间或 smalldatetime 的隐式转换。使用具有确定性样式值的显式 CONVERT。

问题出在一个 INT 列 [GPSTime] 上,它记录了从“1970-01-01 00:00:00”开始的秒数,我正在尝试将其转换/转换为日期时间,例如

CAST(DATEADD(SS,[GPSTime],'1970-01-01' ) AS DATETIME)

或者

CONVERT(VARCHAR,DATEADD(SS,[GPSTime],'1970-01-01' ),113)

或者

CONVERT(DATETIME,DATEADD(SS,[GPSTime],'1970-01-01' ),113)

上面三个选项中的每一个都给了我前面提到的错误。

这是解决方法吗?

4

2 回答 2

1

要猜测问题实际上是在 上'1970-01-01',试试这个:

Dateadd(ss, gpsTime, convert(datetime, '1970-01-01', 101))

或者您可以将日期时间值保存在另一个表中(作为避免转换的日期时间)或编写一个确定性函数来返回您的日期时间:

create function [dbo].[UnixEpoch]
()
returns datetime
with schemabinding
as
begin
    RETURN convert(datetime, '1970-01-01', 101)
end

go

select objectproperty(object_id('[dbo].[UnixEpoch]'), 'IsDeterministic')

SELECT dbo.unixEpoch()

编辑:

请注意应用于convert(datetime, '1970-01-01', 101)

根据http://msdn.microsoft.com/en-us/library/ms178091.aspx上的文档:

源或目标类型为 datetime 或 smalldatetime,其他源或目标类型为字符串,并指定了非确定性样式。为了具有确定性,样式参数必须是常数。此外,小于或等于 100 的样式是不确定的,除了样式 20 和 21。大于 100 的样式是确定的,除了样式 106、107、109 和 113。

于 2014-11-19T15:28:28.363 回答
0

我得到了同样的错误并且不仅使用转换修复它:

CONVERT(DATETIME, firstdate, 102) AS firstdate

在 SELECT 子句上,而且在 WHERE 子句中为:

WHERE  firstdate >= CONVERT(DATETIME,'20150101',102)

我希望这个解决方案有帮助!

于 2020-10-22T03:23:40.917 回答