日付フォーマットについての混乱
Tedさん、こんにちは。
「インポート・ファイルへのコピー (CPYTOIMPF)」コマンドを使用して、MySQLシステムに送信されるCSVファイルを作成しています。タイムスタンプ フィールドのフォーマットのせいで、同僚はそのファイルをインポートできないようです。CPYTOIMPFは、日付と時刻の間にハイフンを入れます(たとえば、2021-05-10-04.36.24.849555)が、同僚のシステムでは日付と時刻の間にスペースが必要なようです。専用プログラムを書く以外に、タイムスタンプ出力のフォーマットを変更する方法はないでしょうか。
-- Richardより
Richardさん、専用プログラムは必要ありません。この要件を処理する別の方法があります。
ありがたいことに、IBMは、よく使用されるいくつかの日付、時刻、およびタイムスタンプ フォーマットをすでに用意してくれていますが、必要となる可能性のあるすべてのフォーマットを予測するというのは、IBMでも無理なことでしょう。そうした場合には、他のツールを利用できます。
このケースでは、 TO_CHAR 関数を使用して必要なフォーマットにタイムスタンプをフォーマットするSQLビューを作成することをお勧めします。
create view SomeView as
( select this, that, the_other,
to_char(TStamp, 'yyyy-mm-dd hh.mi.ss') as TStamp
from SomeTable);
TO_CHAR関数の2つ目のパラメーターで、日付/時刻値をどのようにフォーマットしたいかを指定できます。結果は、Richardさんのストリーム ファイルにぴったりはまる文字フィールドということになります。
では、CPYTOIMPFコマンドでビューを参照します。
CPYTOIMPF FROMFILE(SOMEVIEW)
TOSTMF('/somedir/somefile.csv')
STMFCODPAG(*PCASCII)
RCDDLM(*CRLF)
ほら、出来上がりです。これだけです。
日付、時刻、およびタイムスタンプについては、多くの混乱があるようです。ほぼ同じ頃、Bobさんという別の読者からも、日付フォーマットに関する質問メールをもらいました。Bobさんのケースでは、日付が物理ファイルでMM-DD-YYYYフォーマット(たとえば、05-10-2021)で格納されるようにしてほしいと同僚から言われているということでした。彼は、物理ファイルのDDSまたはRPG定義(「D」)仕様書のいずれかで使用する、言われた通りのフォーマットを指定できるDATFMT値を探してみたそうです。が、もちろん、見つかりませんでした。
日付/時刻フォーマットに関する混乱は、長い間、ミッドレンジ プログラマーが、日付および時刻を数値および英数字(文字)フィールドに格納しなければならなかったことが原因なのではないかと思います(私自身は、日付と時刻が1つの数値または英字フィールドに一緒に格納されるシステムで作業したことはありませんが、そうだったのだろうと想像はします)。当時は、適切に使用するためには、日付または時刻がどのように格納されるかを知っている必要がありました。
時代は変わりました。今は、日付/時刻データ タイプがあります。Bobさんには、DDS仕様書またはRPG D仕様書で指定されたフォーマットに関係なく、日付は日付であって、日付以外の何物でもない、と指摘しておきました。列(フィールド)を、日付、時刻、またはタイムスタンプ データ タイプとなるように定義すると、システムは内部フォーマットで値を格納します。そして、喜ばしいことに、その内部フォーマットがどのようなものなのかを知っている必要はありません。
日付をある特定のフォーマットで格納してほしいと言われたとしたら、おそらく、それが意味するのは、日付をそのフォーマットで 表示 したいということであり、そして、これはさらに喜ばしいことです。たとえば、ある日付列を月-日-年というフォーマットで表示したい人と、同じ日付を日-月-年というフォーマットで表示したいがいるとしたら、両者の望みが叶うのです。
Bobさんの問題は、Richardさんの問題と同じように解決されます。
select to_char(SomeDate, 'mm-dd-yyyy') from SomeTable;
私見ですが、字義通りに物事を捉える考え方こそが、多くのIBM iのショップが1990年代から抜け出せないでいる理由の1つなのだと思います。