SQL 服务器 - 当 case 语句不允许时,STDEVP 在 datetime 列上失败

SQL Server - STDEVP failing on datetime column when case statement shouldn't allow it to

我有一个名为 RANDOMDate 的列,其数据类型为日期时间。我只想在所有列都是数字内容时对它们执行 STDEVP。因此,如果我遇到 RANDOMDate,我希望下面的案例语句简单地为 RANDOM 传递 0,下面的语句仅适用于 RANDOMDate 列:

select STDEVP(CASE WHEN ISNUMERIC(CAST([DataStorage].[dbo].[DateTest].[RANDOMDate] as nvarchar(max))) = 1 THEN [DataStorage].[dbo].[DateTest].[RANDOMDate] ELSE 0 END) AS StandardDeviation
from [DataStorage].[dbo].[DateTest]

然而,这失败并出现错误:

Operand data type datetime is invalid for stdevp operator.

我期待,因为 case 语句说当 char 值的 ISNUMERIC 然后传入列,否则传入 0,这不应该处理 RANDOMDate 是 datetime 的问题吗?

知道问题出在哪里吗?请注意,我必须将 STDEVP 保留在 case 语句的外部,因为我需要一个聚合函数。

Not sure i understand the Return Types explanation

一个CASE表达式:

Returns the highest precedence type from the set of types in result_expressions and the optional else_result_expression. For more information, see Data Type Precedence (Transact-SQL).

CASE

SQL 服务器对数据类型使用以下优先顺序:

user-defined data types (highest) 
sql_variant 
xml 
datetimeoffset 
datetime2 
datetime 
smalldatetime 
date 
time 
float 
real 
decimal 
money 
smallmoney 
bigint 
int 
smallint 
tinyint 
bit 
ntext 
text 
image 
timestamp 
uniqueidentifier 
nvarchar (including nvarchar(max) ) 
nchar 
varchar (including varchar(max) ) 
char 
varbinary (including varbinary(max) ) 
binary (lowest) 

Data type precedence

所以这个表达式

CASE WHEN ISNUMERIC(CAST([DataStorage].[dbo].[DateTest].[RANDOMDate] as nvarchar(max))) = 1 THEN [DataStorage].[dbo].[DateTest].[RANDOMDate] ELSE 0 END

的数据类型为 datetime,因为 datetime 的优先级高于 int

所以你需要添加一个转换来强制CASE表达式return一个与STDEVP兼容的类型,而float可能是最好的选择:

select STDEVP(CASE WHEN ISNUMERIC(CAST([RANDOMDate] as nvarchar(max))) = 1 THEN cast([RANDOMDate] as float) ELSE 0 END) AS StandardDeviation
from [DateTest]