私は軍事時間を文字として格納するpostgres SQLデータベースを使用しています(質問しないでください...)。時間そのものである列に時間を加算/減算する列を更新する必要があります。時間と分 (HHMM または 1005) のみを格納する列もあれば、タイムスタンプとして時間、分、秒を格納する列もあります。
例えば; 列TaxiTime
には時間と分のみが格納され
1005
ます0050
。たとえば、最初のエントリでは 10 時間 5 分、2 番目のエントリでは 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
これにより、 and句の基準を満たしたすべての行 (現在は 16 行) が更新されると思っていましたが、AND
間違っていました。これにより、この基準を満たすすべてのレコードが更新されますが、サブクエリの 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 の場合、-03:00 ではなく 21:00 に正しく計算する必要があるためです。繰り返しますが、これらの列のいくつかはタイプのものですnumeric
が、他のものはcharacter
...完全に私の手に負えず、修正するために何もできないので、私はそれを回避するために最善を尽くしています.
私はSQLFiddleを作成し(それを提案した人に感謝します)、いくつかのデータを入力することができました....私のETD値のいくつかはそうであるはずでしたが、フィドルで0000
aを実行すると、それらは. とにかく、これがSQL Fiddleです。SELECT
0