私は以下のようにSQLを書くのを楽しんでいます。
利点は、複数回使用するコードブロックを再利用できることです。何かを修正するときは、常に1か所で修正するだけで済みます。
たとえば、extract(sys_dateからの年)の代わりにcurrent_yearを2回書き込みます。
他の例では、to_dateの代わりにfirst_of_april_this_yearを2回書き込みます('01 .APR。 '|| current_year ||' 00:00:00 '、' DD.MON.YYYY HH24:MI:SS ')。
それは機能しますが、以下に示すように、あまりきれいではなく、読みやすくありません。複数の場所で何かを修正する必要がないという利点を失わずに、読みやすくするためのより良い提案はありますか?with-clausesも使用しましたが、IMHOはさらに読みにくくなっています。どうもありがとうございました!<3
PS:ここでコードブロックを再利用するというトピックにとどまり、テスト可能な方法で前の4月1日を見つけるというこの特定のタスクがどのように改善されたかを掘り下げないでください。TY!
-- gives the latest 1st of April based on sysdate, whereas for testing sysdate can freely be set
select
case when sys_date <= first_of_april_this_year then first_of_april_last_year else first_of_april_this_year end previous_first_of_april
-- ,params3.*
from (
select
to_date ('01.APR.'|| current_year ||' 00:00:00', 'DD.MON.YYYY HH24:MI:SS') first_of_april_this_year,
to_date ('01.APR.'||(current_year-1) ||' 00:00:00', 'DD.MON.YYYY HH24:MI:SS') first_of_april_last_year,
params2.*
from (
select
extract (year from sys_date) current_year,
params1.*
from
(select
to_date ('02.AUG.2018 00:00:01', 'DD.MON.YYYY HH24:MI:SS') sys_date -- for testing, sysdate can be overwritten
--sysdate sys_date
from dual) params1
) params2
) params3;
サブクエリファクタリング(別名共通テーブル式、別名CTE)を使用して、複数のサブクエリを含むクエリを読みやすくすることができます。たとえば、クエリは次のようになります。
WITH params1 AS (SELECT to_date('02.AUG.2018 00:00:01', 'DD.MON.YYYY HH24:MI:SS') sys_date -- for testing, sysdate can be overwritten
--sysdate sys_date
FROM dual),
params2 AS (SELECT extract(YEAR FROM sys_date) current_year,
sys_date
FROM params1),
params3 AS (SELECT to_date('01.APR.' || current_year || ' 00:00:00', 'DD.MON.YYYY HH24:MI:SS') first_of_april_this_year,
to_date('01.APR.' || (current_year - 1) || ' 00:00:00', 'DD.MON.YYYY HH24:MI:SS') first_of_april_last_year,
sys_date
FROM params2)
SELECT CASE
WHEN sys_date <= first_of_april_this_year THEN
first_of_april_last_year
ELSE
first_of_april_this_year
END previous_first_of_april
FROM params3;
余談ですが、日付に基づいて4月1日を計算することは、より簡単に行うことができます。
SELECT add_months(TRUNC(add_months(SYSDATE, -3), 'yyyy'), 3)
FROM dual;
ここでは、指定した日付から3か月前に戻り、結果の日付をその年に切り捨てて(その年の1月1日になるように)、3か月前に戻すだけで、その年の4月1日になります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加