0

我有一个名为 RANDOMDate 的列,它的数据类型为 datetime。只有当它们是数字内容时,我才想在所有列中执行 STDEVP。因此,如果我遇到 RANDOMDate,我希望下面的 case 语句只为 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]

但是,这失败并出现错误:

操作数数据类型 datetime 对 stdevp 运算符无效。

我期待既然case语句说当char值的ISNUMERIC然后传入列,否则传入0,这不应该解决RANDOMDate是日期时间的问题吗?

任何想法可能是什么问题?请注意,我必须将 STDEVP 保留在 case 语句的外部,因为我需要一个聚合函数。

4

1 回答 1

2

不确定我是否理解返回类型的解释

一个CASE表达式:

从 result_expressions 和可选的 else_result_expression 的类型集中返回优先级最高的类型。有关详细信息,请参阅数据类型优先级 (Transact-SQL)。

案子

SQL Server 对数据类型使用以下优先顺序:

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) 

数据类型优先级

所以这个表达式

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

数据类型为datetimesincedatetime的优先级高于int.

所以你需要添加一个转换来强制 CASE 表达式返回一个与 兼容的类型,这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]
于 2018-09-19T23:25:15.727 回答