【问题标题】:Why is CONVERT(TIME(7), expression) not deterministic?为什么 CONVERT(TIME(7), expression) 不是确定性的?
【发布时间】:2013-07-31 01:46:38
【问题描述】:

我有一个现有的表,我想添加一个计算列

[dbo].[Route]
   ...
   [EstimatedArrival] TIME (7) NOT NULL,
   [DriveSeconds]     INT      NOT NULL,
   [WaitSeconds]      INT      NOT NULL,
   ...

但是当我尝试在下面添加TIME 的计算列时

ALTER TABLE [dbo].[Route]
  ADD [EstimatedDeparture] AS 
  CONVERT (TIME (7), DATEADD(SECOND, 
    (((DATEPART(HOUR, [EstimatedArrival]) * 3600) 
     + (DATEPART(MINUTE, [EstimatedArrival]) * 60)  
     + DATEPART(SECOND, [EstimatedArrival])) 
     - [DriveSeconds] - [WaitSeconds]), ''), 114) 
  PERSISTED;

它抛出

表“Route”中的计算列“EstimatedDeparture”无法持久化,因为该列是不确定的。

为什么?我认为CONVERT(TIME (7) ...) 应该保证列类型为TIME

请注意,如果我在查询中使用此 Convert 表达式,它可以正常工作。 我该如何解决这个问题?

【问题讨论】:

  • @HABO 事实证明,is 里面有一个字符串格式(注意''),而 114 似乎与问题。

标签: sql sql-server tsql calculated-columns


【解决方案1】:

这个空字符串应该代表什么?

- [DriveSeconds] - [WaitSeconds]), ''), 114) 
-----------------------------------^^

这可能会告诉 SQL Server 您将把其中的一部分解释为字符串。虽然我同意 HABO 的观点,即您也不需要 114 样式,但我能够使用以下代码完成这项工作,它仍然使用不必要的样式编号:

- [DriveSeconds] - [WaitSeconds]), 0), 114) 

是否仍然保留正确的计算,我不确定,因为我不知道意图是什么,但在这里避免隐式转换为字符串应该可以避免问题。

【讨论】:

  • 根据MSDN,这是DATEADDdate参数。将其设置为 0 可以解决问题。太棒了!
  • 我也同意不需要 114。
【解决方案2】:

你可以这样改正和简化:

ALTER TABLE [dbo].[Route]
ADD [EstimatedDeparture] AS 
CONVERT (TIME (7), DATEADD(SECOND, - [DriveSeconds] - [WaitSeconds], [EstimatedArrival]))
PERSISTED;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 2019-08-01
    • 1970-01-01
    • 2020-06-19
    • 2019-04-20
    • 2017-10-12
    • 1970-01-01
    相关资源
    最近更新 更多