Re:通过在SQL Server中减去另外两列来计算列

时间:2015-11-03 16:05:04

标签: 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), 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。所以我尝试将time_in_flight的代码等于time_in_only less time_out_only,如下所示,

ALTER TABLE Trip
SET time_in_flight = time_in_only - time_out_only;

我收到的错误消息是

  

“Msg 102,Level 15,State 1,Line 2.语法不正确   “Time_in_Flight”。

除非我使用SET不正确并且我应该使用不同的功能,否则我对我出错的地方感到困惑。但是我之前认为这种语法对我有用。

任何人都可以指导我在这里出错的地方,并帮助我弄清楚如何使用一些函数和公式减去两列。

谢谢Josie

1 个答案:

答案 0 :(得分:1)

首先,时间没有减法算子。所以使用

SELECT time_in_only - time_out_only
FROM trip

你会得到:

  

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

如果你想要计算列,你可以先DROP column重新创建它:

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));

LiveDemo

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

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

LiveDemo2

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

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