我正在使用一个 postgres SQL 数据库,该数据库将军事时间存储为字符(不要问...),我需要更新一个列,该列将时间添加/减去时间本身的列。一些列仅存储小时和分钟(HHMM 或 1005),而一些列将小时、分钟和秒存储为时间戳......所以我只剩下解析和提取数据了。
例如; 列TaxiTime
仅存储小时和分钟,如下所示:
1005
或0050
将等于第一个条目的 10 小时 5 分钟和第二个条目的 0 小时 50 分钟。
我是 postgresql 的新手,但不是 SQL 的新手,所以我已经能够鼓起这个查询:
UPDATE "myTable".tgtplsel ts
SET etd = subquery.new_etd
FROM((SELECT
replace(((((interval '1 hours' * substring(starttime, 1, 2)::integer) +
(interval '1 minutes' * substring(starttime, 3, 2)::integer)) +
((interval '1 hours' * ((SELECT zuluoffset FROM "myTable".airports WHERE name = 'KABC'))) +
(interval '1 minutes' * 0) +
(interval '1 seconds' * 0))) +
((interval '1 hours' * substring(ts.taxidelay, 1, 2)::integer) +
(interval '1 minutes' * substring(ts.taxidelay, 3, 2)::integer)) +
((interval '1 hours' * substring(ts.etd, 1, 2)::integer) +
(interval '1 minutes' * substring(ts.etd, 3, 2)::integer))::time)::char(5), ':', '') as new_etd, ts.exerciseid
FROM "myTable".tgtplsel as ts
INNER JOIN "myTable".exerparm as ep ON ts.exerciseid = ep.exerciseid
WHERE ts.exerciseid = 11
AND ts.taxidelay is not null
AND length(ts.taxidelay) > 0)) as subquery
WHERE ts.exerciseid = subquery.exerciseid
AND ts.exerciseid = 11
AND ts.taxidelay is not null
AND length(ts.taxidelay) > 0
我认为这会更新所有符合WHERE
andAND
子句标准的行(当前为 16 行),但我错了。这将更新所有满足此条件的记录,但仅使用子查询的 FIRST 值。为什么?
子查询本身返回 16 行,计算正确,例如:
0245
1050
0920
0345
1210
etc.
但是当我把它变成一个UPDATE
语句时,它会更新所有 16 行0245
。
为什么?更重要的是,我怎样才能让它用正确的值更新每一行?
更新
首先,我很抱歉没有提供所有信息....我在下班的路上把它放在一起,很着急...现在....回答一些问题...
PostgreSQL 版本是8.3 .3
“myTable” 不是真正的模式名称,但我不得不用其他名称替换原来的名称。
关于我要完成的工作,这里有一点点破败:我正在尝试使用从其他几个字段计算的值来更新表的ETD
列。tgtplsel
我们用来生成这个新值的公式是:
ETD = ((starttime - zuluoffset) + taxidelay + ETD)
所以如果我的 ETD 是 00:30,starttime 是 23:00,zuluoffset 是 -5,taxidelay 是 0005,那么新的 ETD 应该是 ((23:00 - (-5)) + 00:05 + 00:30 ) 或 18:35。将这些转换为time
orinterval
类型的原因是因为开始时间可能是 02:00 或凌晨 2 点,如果 zuluoffset 是 -5,那么我需要正确计算到 21:00,而不是 -03:00。同样,其中一些列是类型numeric
,而另一些则character
......完全不在我的手中,无法做任何事情来修复它,所以我正在尽我最大的努力解决它。
我能够创建一个 SQLFiddle(感谢那些建议它的人)并输入一些数据....虽然我的一些 ETD 值应该是0000
,如果我SELECT
在小提琴中做一个,它们会以0
. 无论如何,这是SQL Fiddle。