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 )
年月で比較したい
これを行う方法?
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/2012
0 に相当する整数除算であり、整数から日時へ、またはその逆への暗黙的なキャストはありません。
あなたは書くことができます:
-- 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 関数を使用できます。それは冗長になる傾向があります。
それが適切な日付フィールドであると仮定するとh_date
、なぜそうしないのでしょうか
SELECT
id
, name
FROM h_history
WHERE h_date >= '02/01/2012' and h_date <= '01/31/2013'
あなたのために働きますか?
以下を試してください
SELECT
id,name
FROM h_history
WHERE
h_date >= MDY(2, 1, 2012)
AND h_date < MDY(2, 1, 2013)