1

以前に Informix を使用したことがなく、過去 365 日間のレコードを返すクエリを作成しようとしています。

これが私が使用しようとしているクエリです:

Select * from Visit where vis_mod_dt between today-365 and today;

過去 365 日間のデータがあることはわかっていますが、レコードは返されません。vis_mod_dt は真の日付列ではないと推測していますが、「12/31/1899」と表示されますが、次を使用してこの列をキャストしようとしました:

select * from visit where date(vis_mod_dt) between today-365 and today;

これはまだデータを返しません。

何か案は?

4

3 に答える 3

3

Informix DATE 形式

日付 1899-12-31 は、ゼロ (0) の内部日付表現に対応することに注意してください。つまり、Informix は内部的に DATE 値を 4 バイトの整数で格納し、1899 年 12 月 31 日からの日数をカウントするため、1 日目は 1900 年 1 月 1 日でした (そして 1900 年がうるう年ではないことがわかっているため)。 、60 日目は 1900-03-01 でした)。

その事実は、私があなたのテーブルに何があるかを心配させます. ただし、要求に応じてテーブル内のデータを DATE に変換できない場合は、通常、エラーが発生します。

あなたのテーブルスキーマは何ですか?

DB-Access と Info/Tables オプションを使用してスキーマを確立するか、DB-Schema を使用することをお勧めします。

dbschema -d dbase -t visit

DB スキーマの出力は、質問に追加するのに適しています。

「TODAY-365」と「TODAY」を使用したクエリ式は、選択するデータがある場合は正常に機能するはずです。

DBDATE 環境変数

文字列表現から日付に変換するために、環境変数 DBDATE を設定する必要がある場合があります。おそらく(アイコンから)英国に拠点を置いているため、DBDATEの値を次のように設定する必要がある場合があります。

export DBDATE=DMY4/

これは、日付が日、月、4 桁の年で構成され、優先セパレータとして「/」が使用されることを示しています。US 形式の場合、推定されるデフォルト値は通常 'MDY4/' であることを知っても驚かないでしょう。私は習慣的に「Y4MD-」を使用しているので、DATE 値は、ISO 8601:2004 の日付表記である DATETIME YEAR TO DAY と同じように見えます。(これには多くの利点があります。あいまいさがなく、単純なソート アルゴリズムがそのような日付を日付順にソートします。) IDS のバックグラウンドには実際に多くのメカニズムがあります (IBM Informix Dynamic Server - これは、あなたが使用している DBMS であると思います)。 Informix DBMS でもある代替手段がいくつかあります) など、2 桁の日付を含む文字列は通常正しく変換されます (ただし、あいまいで望ましくありません)、および '/' 以外の区切り記号


この質問に対する回答を改善するために必要な情報 - 第1版。

ここにあるものが役に立たない場合は、質問を編集して次の内容を含めることをお勧めします。

  1. テーブル スキーマ。
  2. 選択する必要があると思われるが、選択されていない数行 (2 ~ 4 行) のデータ。
  3. プラットフォームおよびバージョン情報。バージョンを IDS 11.50.FC4W1 の詳細レベルまで下げると役立ちます。時々それは重要です。もちろん、ほとんどの場合、最初の 3 桁が物事に影響を与えます。

テーブルが大きい (列が多い) 場合は、キー列を選択してみてください (vis_mod_dt最も重要なものです)。理想的には、ディスプレイにスクロール バーは必要ありません。機密情報が含まれていないことを確認してください。


この質問に対する回答を改善するために必要な情報 - 第2

私があなたに尋ねる質問に注意を払うならば、私はあなたを助けます. 私が尋ねる質問に注意を払わないなら、私はあなたを助けることができません. また、「回答」として情報を追加するのではなく、質問を編集してください。

  • テーブル スキーマとは からの出力は何ですか:

    SELECT t.tabid, t.tabname, c.colno, c.colname, c.coltype, c.collength
      FROM "informix".systables AS t, "informix".syscolumns AS c
     WHERE t.tabid = c.tabid
       AND t.tabname = "visit"
     ORDER BY t.tabid, c.colno;
    
  • あなたは何から得ますか:

    SELECT TODAY, TODAY-365 FROM "informix".systables WHERE tabid = 1;
    
  • 環境変数 DBDATE が設定されていますか? もしそうなら、その価値は何ですか?

  • 環境変数 CLIENT_LOCALE または DB_LOCALE が設定されていますか? もしそうなら、それらの値は何ですか?
  • どのバージョンの Informix を使用していますか?
  • どのプラットフォームで使用していますか?
  • クエリの実行に使用している言語またはツール。

注: 上記のクエリをコピー アンド ペーストできない場合は、引用符で囲まれた「informix」を含める必要はない可能性があります。システム カタログの属性。ただし、記述されているように、クエリは現存する Informix データベース (OnLine 5.x、SE 5.x または 7.x、IDS 7.x、XPS 8.x、IDS 9.x または 10.x または 11) で機能します。 x - データベースの任意のモード (ログなし、ログあり、MODE ANSI)。一部の古いバージョンではサポートされていないことを除いて、私は JOIN 表記を使用しますが、それが問題になるには非常に古いバージョンを使用する必要があります。

于 2009-10-12T19:18:38.253 に答える
0

次のコマンドを実行すると、データが取得されるため、これは少し混乱します。

「2008年10月1日」と「2009年10月1日」の間のvis_mod_dtの訪問からcount(*)を選択します

于 2009-10-13T13:20:12.597 に答える
0

テーブルを ascii ファイルにアンロードして、アンロードされた vis_mod_dt 値を調べて、DBDATE=MDY4 (mmddyyyy) 形式に準拠しているかどうかを確認してください。準拠している場合は、ALTER vis_mod_dt を TYPE DATE に変更し、それが DATE 列でない場合は、アンロードされたものを LOAD します。テーブルを戻します。

the: "BETWEEN today-365 AND today" SELECT ステートメントの部分は、私のアプリで機能します。

于 2010-02-27T23:48:51.357 に答える