时间标准差

Acc*_*_CO 5 sql-server type-conversion time date-math

是否有 T-SQL 编码最佳实践来获得一组时间的准确标准偏差值?STDEV不喜欢time数据类型。我在想,可能是将分钟转换为整数,但是从/到什么的转换?有什么建议?

And*_*y M 9

您可以time使用DATEDIFF()DATEDIFF_BIG()函数将值转换为相应数量的所需时间单位:

DATEDIFF(MINUTE, CAST('00:00' AS time), YourTimeColumn) AS Minutes

DATEDIFF(SECOND, CAST('00:00' AS time), YourTimeColumn) AS Seconds

DATEDIFF(MILLISECOND, CAST('00:00' AS time), YourTimeColumn) AS Milliseconds
Run Code Online (Sandbox Code Playgroud)

基本上,您只是在给定单位中获得时间戳00:00:00.0000000和您的时间值之间的差异。

你可以把整个表达式放在里面STDEV

STDEV(DATEDIFF(MINUTE, CAST('00:00' AS time), YourTimeColumn))
Run Code Online (Sandbox Code Playgroud)

当然,这会在几分钟内为您提供偏差。如果您需要将其转换回time,您可以通过应用DATEADD()STDEV结果来实现:

DATEADD(
  MINUTE
, CAST('00:00' AS time)
, STDEV(
    DATEDIFF(
      MINUTE
    , CAST('00:00' AS time)
    , YourTimeColumn
    )
  )
)
Run Code Online (Sandbox Code Playgroud)

这样最终的表达式就变得很麻烦了。您可以尝试通过将一些中间表达式定义为列来简化它。一种方法是使用CROSS APPLY. 例如,您可以通过以下方式为DATEDIFF结果定义和使用临时计算列:

SELECT
  ...
  DATEADD(MINUTE, CAST('00:00' AS time), STDEV(tmp.TimeMinutes)) AS TimeStDev,
  ...
FROM
  dbo.YourTable AS data
  CROSS APPLY
  (
    SELECT
      DATEDIFF(MINUTE, CAST('00:00' AS time), data.YourTimeColumn)
  ) AS tmp (TimeMinutes)
  ...
WHERE
  ...
;
Run Code Online (Sandbox Code Playgroud)