2012-05-14 7 views
0

は私が期間の範囲内でデータを取得するためのクエリの作成方法

emp_id, firstname, lastname, month and year. 

のような列を持つ従業員テーブルを持っている今、私は2012年1月2012年3月間テーブルから従業員を取得する必要があります。行進すなわち、月の数字と年の列に、我々は1月と「3」の「1」を記憶されている列月に
はのような年を持っています。
助けてください。 Januarと2012年3月の間

+2

ヒント:OracleにはDATEデータ型があります。ここでは、月と年の列をそのデータ型の1つの列に格納する必要があります。 1日に1を設定し、時、分、秒を0に設定するだけです。クエリがはるかに簡単になり、新しい列のインデックスを作成することができます。 –

答えて

1

従業員数:

select * from employee 
where year = 2012 and month between 1 and 3 
Januar 2012年と2013年3月の間

従業員数:

select * from employee 
where (year = 2012 and month between 3 and 12) 
or (year = 2013 and month between 1 and 3) 
+0

答えをありがとう。 2013年3月から2012年3月にデータを取得する必要がある場合はどうすればよいですか? – ashishjmeshram

+0

@Ashish:私の更新を参照してください –

+0

@Downvoter:Care to comment? –

0
SELECT * 
FROM employee 
WHERE to_char(year,0000) + to_char(month,00) BETWEEN '201201' AND '201203' 
+0

このクエリは、where節に「missing expression」エラーを表示しています。 – ashishjmeshram

+0

申し訳ありませんが、私はあなたがOracleを使用していることを認識していませんでした。私のクエリはSQLで正常に動作しています。あなたはYYYYMMでフォーマットされた文字列に年と月を組み合わせたコンセプトを取ることができ、次に値と比較します – Nick

+0

こんにちは私はOracleのクエリを更新しました。 – Nick

0

私はあなたがやって前に日時にすべてを変換オフ最善だろうと思います選択。私は個人的に、単一のdatetime列の代わりに、別々の「月」と「今年の列を好むだろうが、あなたがそのように行くことができない場合は、このようなものは動作します:

SELECT * FROM employees 
WHERE CAST(CAST(year AS VARCHAR(4)) + 
      RIGHT('0' + CAST(month AS VARCHAR(2)), 2) + 
      '00' 
      AS DATETIME) 
BETWEEN 
    CAST(CAST(start_year AS VARCHAR(4)) + 
      RIGHT('0' + CAST(start_month AS VARCHAR(2)), 2) + 
      '00' 
      AS DATETIME) 
AND 
    CAST(CAST(end_year AS VARCHAR(4)) + 
      RIGHT('0' + CAST(end_month AS VARCHAR(2)), 2) + 
      '00' 
      AS DATETIME) 

それは残念ながら、醜いのようなものです。多分、開始日と終了日を選択ステートメントの前のdatetimeに変換し、それらを変数に格納することでクリーンアップできますか?

-1

こんにちは、これはあなたを助けるかもしれない、私は指定された形式のデータに毎月および年の値に変換し、それらを比較しています

select * from emp 
where to_date(concat('1-',concat(concat(month,'-'), year)),'DD-MM-YY') 
     between to_date('1-&month-&year' ,'DD-MM-YY') 
and to_date('1-&month-&year' ,'DD-MM-YY') ; 

関連する問題