1

DB2 AS/400 の日付は整数で、20 世紀初頭からの日数が含まれています。

質問 1: IBM DB2/AS400 の「ゼロ」の日付を知っている人はいますか? 例えば:

  • 1899/12/30
  • 1899/12/31
  • 1900/1/1

質問 2: "AS/400" の日付 (例: 40010) をどのように CLR DateTime に変換できますか?

DateTime d = new DateTime(40010); //invalid

その他の「ゼロ」の日付は次のとおりです。

  • OLE オートメーション: 1899 年 12 月 30 日
  • SQL サーバー: 1900 年 1 月 1 日
4

6 に答える 6

4

AS/400 の日付がエポック日付1からの日数として内部的に保存されているとは思いません(これは、「ゼロ日付」と呼ばれるもののより一般的な用語です)。Tracy Probst が言ったように、これはネイティブ AS/400 物理ファイルの日付フィールドとはまったく異なります。2

しかし、データを抽出するために使用している方法が何であれ、エポックからの日数としてデータを提供している場合、それは重要ではありません。理想的には、AS/400 を直接見るか、できる人に尋ねて、目的の日付を確認する必要があります。AS/400 の日付が 2009-07-30 で、取得したものが 40022 である場合、エポックの日付は 1900 年 1 月 1 日であると確信できます。40024 を取得している場合、エポックは 12 月 30 日です。 1899 年。

また、Tracy が彼自身の回答についてコメントしたように、日付が一般的な数値フィールドに格納されることは非常に一般的です (これは、検索メソッドが Decimal をデータ型として報告している場合に推測されることです)。いずれにせよ、DB2 の内部日付形式を使用してください。AS/400 の数値フィールドに格納される最も一般的な日付形式は、次の形式、またはそのバリエーションであることに注意してください。

  • yyyymmdd (グレゴリオ暦、ISO 4 桁の年)
  • mmddyy (グレゴリオ暦、米国の 2 桁の年)
  • yyyyddd (いわゆるユリウス暦、4 桁の年)
  • yyddd (いわゆるユリウス暦、2 桁の年)
  • yymmdd
  • cyymmdd (世紀フラグを使用した IBM のクレイジーな発明)

ユリウス日付の ddd は、年の初めからの日数です。IBM のクレイジーな日付の c は、19yy の場合は 0、20yy の場合は 1 です。「The Four Hundred」にエポックからの日数を保存している人は聞いたことがありませんが、別のプラットフォームからの改宗者に遭遇したことがあるかもしれません。AS/400 のメインフレームの遺産は、人間が読める日付を強く支持します。


1 AS/400 (現在は IBM i と呼ばれています) には日付用の独自のデータ型があり、このデータ型は実際にはエポックからの日数で内部的に構成されています。しかし、そのエポックは何千年も前のことであり、20 世紀の変わり目ではなく、西暦の始まりでもありませ。IBM はこの日数をスカリガー数と呼んでいますが、このことを研究しているほとんどの人にとっては、ユリウス日数と呼ばれています。私の回答の主要部分からお気づきかもしれませんが、IBM は「ユリウス」という言葉をまったく異なる意味で使用しています (ユリウス暦とは関係ありません)。つまり、IBM のいわゆる「ユリウス日」は実際にはISO 8601 の序数日付

2日付データ型の内部形式は非常に低レベルであり、ほとんどがユーザー (ほとんどのプログラマーを含む) から隠されています。表向きはファイルの「実際の内容」を表示する DSPPFM コマンドは、少なくとも 1 つのステップは「遅すぎます」: それが報告する値は、内部の 4 バイトの「スカリガー番号」から人間が読める形式に既に変換されています。形。

于 2009-07-31T02:27:05.167 に答える
1

質問1:

私が知る限り、AS/400 物理ファイルには「ゼロ日付」はありません。タイムスタンプ フィールドを含む物理ファイルに対して DSPPFM を実行すると、値は yyyy-MM-ddhh.mm.ss 形式の読み取り可能なタイムスタンプとして格納されます。例: "2005-08-0207.06.33" は、2005 年 8 月 2 日午前 7:06:33 を表します。特定のプログラミング言語内にゼロ日付が存在する可能性があり、それは本当に焦点を当てる必要がある場所です. AS/400 ODBC ドライバーは、日付を SQL_TYPE_TIMESTAMP フィールドに返します。

質問2:

次のように簡単にする必要があります。

DateTime d = Convert.ToDateTime(reader["DateField"]);

他の C# の専門家を招待して、より優れた C# コードで応答を編集してもらいます。

于 2009-07-17T13:39:05.350 に答える
1

質問1:

DB2 の開始日がいつになるかわかりません。とにかく、Googleはあまり役に立ちません。それを理解するために使用できるサンプルデータはありませんか?

更新:日付が日数として保存されていますか? そうではないことを示唆するこのページを見つけました。

質問2:

この例では、開始日を 1900-01-01 と想定しています。ここで、daysは AS/400 の日付値です。

DateTime myDate = new DateTime(1900, 1, 1).AddDays(days);
于 2009-07-16T18:56:30.290 に答える
1

1の答えはわかりませんが、2の場合は次のようにできます。

private DateTime AS400 = new DateTime(1900, 1, 1);

...


DateTime myClrDT = AS400.AddDays(days);
于 2009-07-16T18:57:45.433 に答える
0

marc_s には、SQL Server で「ゼロ」の日付と「最小」の日付を混同するコメントがありました。誰もが例を見ることができるように:

SELECT 
   CAST(0 AS datetime) AS dateTimeZero,
   CAST(0 AS smalldatetime) AS smallDateTimeZero

dateTimeZero              smallDateTimeZero
=======================   ===================     
1900-01-01 00:00:00.000   1900-01-01 00:00:00
于 2009-07-16T18:50:39.850 に答える