このような私のSQLステートメントのいくつか:
IF(timediff(a.wo_finish_time,
IF(a.wo_failure_time <> '0000-00-00 00:00:00',
a.wo_failure_time,
a.wo_creation_time)) < 0,
0,
timediff(a.wo_finish_time,
IF(a.wo_failure_time <> '0000-00-00 00:00:00',
a.wo_failure_time,
a.wo_creation_time)))
ご覧のとおり、一部が2回表示されるため、冗長です。だから私はこのようなユーザー定義変数を試しました:
if(@down_time := timediff(a.wo_finish_time,
IF(a.wo_failure_time <> '0000-00-00 00:00:00',
a.wo_failure_time,
a.wo_creation_time)) < 0,
0,
@down_time)
変数スコープの違いが原因かもしれませんが、機能しません。この@down_time変数宣言をSELECT
リストに入れることができることは知っていますが、それによって出力列にも追加されます。もっと良い方法があるに違いないと思うので、もっと良いアプローチを見つけたいと思って、この質問を投稿します。
次のGREATEST
トリックを使用できます。
SELECT GREATEST(0, TIMEDIFF(a.wo_finish_time,
IF(a.wo_failure_time <> '0000-00-00 00:00:00',
a.wo_failure_time,
a.wo_creation_time)))
FROM yourTable
動的SQLを必要としない別の回避策は、現在のクエリをラップしてから、次のような正しい値をサブクエリすることです。
SELECT
CASE WHEN t.col < 0 THEN 0 ELSE t.col END AS col
FROM
(
SELECT TIMEDIFF(a.wo_finish_time,
IF(a.wo_failure_time <> '0000-00-00 00:00:00',
a.wo_failure_time,
a.wo_creation_time)) AS col
-- other columns?
FROM yourTable
) t
すでにそのようなサブクエリを使用していた場合、またはパフォーマンスが重要ではなかった場合は、この2番目のオプションが理にかなっている可能性があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加