2

Informix DBMS で日付の一部を比較する方法:

次のクエリを書きましたが、構文エラーが発生します。

select id,name from h_history 
 where ( h_date::DATETIME YEAR TO MONTH >= 2/2012 )
   and ( h_date::DATETIME YEAR TO MONTH <= 1/2013 )

年月で比較したい

これを行う方法?

4

4 に答える 4

7

DATETIME ルートを使用する場合は、値を正しくフォーマットする必要があります。そのまま、あなたは書いた:

select id,name from h_history 
 where ( h_date::DATETIME YEAR TO MONTH >= 2/2012 )
   and ( h_date::DATETIME YEAR TO MONTH <= 1/2013 )

2/20120 に相当する整数除算であり、整数から日時へ、またはその逆への暗黙的なキャストはありません。

あなたは書くことができます:

-- Query 1
SELECT id, name
  FROM h_history 
 WHERE (h_date::DATETIME YEAR TO MONTH >= DATETIME(2012-02) YEAR TO MONTH)
   AND (h_date::DATETIME YEAR TO MONTH <= DATETIME(2013-01) YEAR TO MONTH)

これは冗長ですが正確です。ショートカットを使用できます:

-- Query 2
SELECT id, name
  FROM h_history 
 WHERE (h_date::DATETIME YEAR TO MONTH >= '2012-02')
   AND (h_date::DATETIME YEAR TO MONTH <= '2013-01')

ただし、h_dateは DATETIME X TO Y 型ではなく DATE であるため、他のオプションを利用できます。YEAR、MONTH、DAY 関数は、DATE から明白な部分を抽出します (また、DATETIME を関数に渡すと、DATETIME は強制的に DATE に変換されてから処理されます)。完全にロケールに依存しない唯一の DATE コンストラクターは、月、日、年の 3 つの引数を取る MDY 関数です。すべての文字列表現はロケールによって解釈されるため、常にどこでも機能するとは限りません。

次のこともできます。

-- Query 3
SELECT id, name
  FROM h_history 
 WHERE (h_date >= MDY(2,  1, 2012))
   AND (h_date <= MDY(1, 31, 2013))

または:

-- Query 4
SELECT id, name
  FROM h_history 
 WHERE ((YEAR(h_date) = 2012 AND MONTH(h_date) >= 2) OR YEAR(h_date) >= 2013)
   AND ((YEAR(h_date) = 2013 AND MONTH(h_date) <= 1) OR YEAR(h_date) <  2013)

または:

-- Query 5
SELECT id, name
  FROM h_history 
 WHERE (YEAR(h_date) * 100 + MONTH(h_date)) >= 201202
   AND (YEAR(h_date) * 100 + MONTH(h_date)) <= 201301

選択肢があれば、おそらくクエリ 2 を簡潔だが正確に使用するか、クエリ 5 を使用するでしょうが、クエリ 1 ~ 5 はすべて使用可能です。

h_dateある DATETIME 型の列で、DATETIME の一部を比較する必要がある場合は、キャスト (クエリ 1 を参照) または EXTEND 関数を使用できます。それは冗長になる傾向があります。

于 2012-05-03T21:14:51.597 に答える
2

それが適切な日付フィールドであると仮定するとh_date、なぜそうしないのでしょうか

SELECT 
      id
    , name
FROM h_history 
WHERE h_date >= '02/01/2012' and h_date <= '01/31/2013'

あなたのために働きますか?

于 2012-05-02T15:35:43.883 に答える
2

以下を試してください

SELECT
  id,name 
FROM h_history 
WHERE
  h_date >= MDY(2, 1, 2012)
  AND h_date < MDY(2, 1, 2013)
于 2012-05-02T15:11:03.087 に答える