我有一个包含日期时间和时间字段的表,其中日期时间实际上只是日期,时间字段是时间。我需要结合这两个字段来创建一个“created_time”计算字段。我想保留这个计算字段,但是当我尝试组合它们时,我不断收到“非确定性”错误。首先,我不确定我是否理解为什么它是不确定的,但其次,有没有什么奇特的方法可以解决这个问题并实现这个目标?
--------------------------------------------------------
date (datetime) | time (varchar)
--------------------------------------------------------
2021-05-05 00:00:00 | 12:00
2021-05-13 00:00:00 | 18:01
我已尝试使用以下计算,但均无效。
ALTER TABLE dbo.table ADD created_time AS ([date] + [time]) PERSISTED
ALTER TABLE dbo.table ADD created_time AS (DATEADD(millisecond, DATEDIFF(millisecond, 0, [time]), [date])) PERSISTED
最佳答案
首先,+
运算符对 date
和 time
值无效,这看起来很奇怪。所以你需要使用你的第二个版本。
其次,您的 time
列实际上是 varchar
,因此转换是隐式非确定性转换。
您可以使用带有确定性样式参数的 CONVERT
使其具有确定性,例如本例中的 108:
ALTER TABLE dbo.[table] ADD created_time AS
(DATEADD(millisecond,
DATEDIFF(millisecond, 0, CONVERT(time, [time], 108)),
[date])) PERSISTED;
This is documented here ,一些样式参数不是确定性的,因为它可能取决于文化和世纪(年份是两位数)。
我强烈建议您将 time
列转换为 time
数据类型,或者更好的是,将其更改为组合的 datetime
列:
ALTER TABLE dbo.[table]
ALTER COLUMN [time] time NOT NULL;
-- or
ALTER TABLE dbo.[table] ADD created_time datetime NULL;
UPDATE dbo.[table]
SET created_time = (DATEADD(millisecond,
DATEDIFF(millisecond, 0, CONVERT(time, [time], 108)),
[date]));
ALTER TABLE dbo.[table]
DROP COLUMN [time]
DROP COLUMN [date];
ALTER TABLE dbo.[table] ALTER created_time datetime NOT NULL;
https://stackoverflow.com/questions/68337766/
相关文章:
scala - Spark : Why execution is carried by a mast
node.js - 修复创建新 Angular 项目时的上游依赖冲突
python - STATICFILES_DIRS 设置不是元组或列表。尽管它不包含逗号
c - 为什么 GTK 4 报告 "assertion ' GTK_IS_WIDGET(部件 )'
azure-devops - Azure Devops 管道 NPM 审计
javascript - 如何减少 GridStack 网格元素的最小高度和重量?
java - 使用 Keycloak Script Mapper 聚合声明中角色的属性