Sql server Re:通过减去SQL Server中的其他两列来计算列

Sql server Re:通过减去SQL Server中的其他两列来计算列,sql-server,tsql,sql-server-2012,Sql Server,Tsql,Sql Server 2012,我的表名Trip中有以下列 trip_no (PK, int, not null), ID_company (FK, int not null), plane (char(25), not null), town_from (char(25) not null), town_to (char(25) not null), time_out (datetime, not null), time_in (datetime, not null), time_out_only (time(0), nul

我的表名Trip中有以下列

trip_no (PK, int, not null),
ID_company (FK, int not null),
plane (char(25), not null),
town_from (char(25) not null),
town_to (char(25) not null),
time_out (datetime, not null),
time_in (datetime, not null),
time_out_only (time(0), null),
time_in_only (time(0) null),
time_in_flight (time(0) null);
对于最后三列,我的第一行是这样的

time_out_only   time_in_only   time_in_flight
 14:30:00        17:50:00        null
我想把飞行时间计算到02:20:00。所以我试着用代码计时飞行中的时间,等于飞行中的时间,小于飞行中的时间,如下所示

ALTER TABLE Trip
SET time_in_flight = time_in_only - time_out_only;
我收到的错误消息是

“Msg 102,15级,状态1,第2行。附近语法不正确 “飞行中的时间”

除非我在使用SET时不正确,并且我应该使用不同的函数,否则我对我的错误方向感到困惑。然而,我以前认为这种语法对我有用

有谁能告诉我哪里出了问题,并帮助我找出如何使用一些函数和公式减去这两列


谢谢Josie首先,时间上没有减法操作符。所以使用

SELECT time_in_only - time_out_only
FROM trip
您将获得:

操作数数据类型时间对于减法运算符无效

如果需要计算列,您可以先
删除列
,然后重新创建它:

ALTER TABLE Trip
DROP COLUMN time_in_flight;

ALTER TABLE Trip
ADD time_in_flight 
  AS  DATEADD(mi, DATEDIFF(mi, time_out_only,time_in_only), CAST('00:00:00' AS TIME));

如果不想重新创建表结构并手动计算,请使用
UPDATE

UPDATE Trip
SET time_in_flight = DATEADD(mi, 
                  DATEDIFF(mi, time_out_only,time_in_only), CAST('00:00:00' AS TIME));

最后一种可能的解决方案是创建视图:

CREATE VIEW vw_Trip
AS
SELECT -- cols,
   time_in_flight = DATEADD(mi,
                 DATEDIFF(mi, time_out_only,time_in_only), CAST('00:00:00' AS TIME))
FROM Trip

爱管闲事的好奇者:你们有23:30到1:50的航班吗?你能有持续24小时以上的航班吗?@PhilipKelley…….是的,我能有持续24小时以上的航班,见最后的讨论。谢谢你,我用了你的第一个例子,我删除了这个专栏,然后重新创建了它,这很有效,但我有一个问题。其中一行的时间为16:20,时间为03.40,计算为负760分钟。我该如何设置专栏的格式以反映24小时制,并确保我的答案是肯定的?@Josie如果你的答案是肯定的,你会得到
11:20:00
,这是肯定的correct@Josie不管怎样,你是怎么计算的?16.20至3.40-时间跨度为
11:20
680分钟
而非760分钟。如果需要分钟,请使用:
DATEDIFF(mi,'00:00:00',DATEADD(mi,DATEDIFF(mi,仅限超时,仅限超时),CAST('00:00'AS time))你是对的答案是680分钟。我删除了该列,重新创建该列时语法出现错误。谢谢当我使用第一个代码时,(正确地)结果在几个小时内出来,当我使用最后一个代码时,结果在几分钟内出来。我一直在寻找几分钟后的结果,但学习这两种方法肯定很有帮助。非常感谢。