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).
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)
所以这个表达式
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]
我有一个名为 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).
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)
所以这个表达式
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]