2016-12-17 11 views
2

SQLを使用する際には非常に新しく、私がしようとしていることは、月と年のみを使用してwaterUsageとelectrcityUsageを選択し、前年のwaterUsageとelectrcityUsageを選択することです。Oracle SQLでの日付の処理

しかし、私はこの作業を行うために日付を使用する適切な方法を理解できないようです。

表:monthlyBill

1. billingDate 01-SEP-15 
2. waterUsage varchar(256) 
3. electrcityUsage varchar(256) 
4. accountNumber varchar(256) 
select electrcityUsage, waterUsage 
from monthlyBill 
where accountNumber ='211' 
    and billingDate = '12-12' /*,month, year*/ 

または

select electrcityUsage, waterUsage 
from monthlyBill 
where accountNumber ='211' 
    and billingDate = DATEADD(year,-1,GETDATE()); /*,previous year*/ 
+0

billingDateのデータ型は何ですか? [Oracleのマニュアル]に(https://docs.oracle.com/database/121/SQLRF/toc.htm)あなたは 'DATEADD()'や 'GETDATE()を' –

+3

サーバ?構文はOracle以外のSQL Serverです。 –

+0

は、OracleまたはSQLを使用しています見つけた –

答えて

4

1つのオプションは、TO_CHARを使用しています。

select electrcityUsage, waterUsage 
from monthlyBill 
where accountNumber = '211' and 
    to_char(billing_date, 'MM-YYYY') = '12-2012' 

これは、あなたが実際にSQL Oracleを使用して、していないことを前提としていサーバ。

20122011が必要な場合は、別の条件をWHERE句に追加してください。私は、この場合にはEXTRACTを使用することがあります:

select electrcityUsage, waterUsage 
from monthlyBill 
where accountNumber = '211' and 
    extract(month from billingDate) = 12 and 
    extract(year from billingdate) in (2011, 2012) 
+0

ですが、あなたは全く同じことをしますが、マイナス1年はどうしますか? – user2402107

+0

「2011」年をハードコードしたい、または今年の1年前にしますか? –

+0

文は、 – user2402107

2

billingdateDATE列であると仮定すると。

DATEを文字列値と比較することはできません。日付のみの「部品」を比較したい場合は、日付を文字列に変換する必要があります。

select electrcityUsage, waterUsage 
from monthlyBill 
where accountNumber ='211' 
    and to_char(billingDate,'MM-YY') = '12-12' 

しかし、私はを強くは常に使用4桁の年に推薦する:

select electrcityUsage, waterUsage 
from monthlyBill 
where accountNumber ='211' 
    and to_char(billingDate,'MM-YYYY') = '12-2012' 

または抽出機能を使用します。今年引く、前年度取得するには

select electrcityUsage, waterUsage 
from monthlyBill 
where accountNumber ='211' 
    and extract(month from billingDate) = 12 
    and extract(year from billingdate) = 2012; 

を、しかし、 Oracleでは、DATEの場合、常にに(データ型の名前にもかかわらず)時間が含まれていることを考慮する必要があります。彼らはになりそうだとして、

私はこのような場合にはTO_CHARまたはEXTRACT関数の使用を避けることをお勧めします:BILLINGDATEはDATE列であると仮定すると00:00:00使用trunc()

select electrcityUsage, waterUsage 
from monthlyBill 
where accountNumber ='211' 
    and trunc(billingdate) = trunc(sysdate - interval '1' year); 
+0

@TimBiegeleisenを言うでしょうWHERE何でも前に1年:証拠読書のためのおかげで、私は非常にお勧めします) –

0

までの時間を設定するには小規模なデータベースやテーブルでは問題にならないかもしれませんが、大きなテーブルを照会するときにはおそらく非常に重要です。代わりに、私は日付の範囲を処理するための比較BETWEEN使用に慣れ示唆 - 次のようなもの:

SELECT ELECTRICITYUSAGE, WATERUSAGE 
    FROM MONTHLYBILL 
    WHERE ACCOUNTNUMBER = '211' AND 
     BILLING_DATE BETWEEN TO_DATE('01-DEC-2012 00:00:00', 'DD-MON-YYYY HH24:MI:SS') 
         AND TO_DATE('31-DEC-2012 23:59:59', 'DD-MON-YYYY HH24:MI:SS') 

をこれは、OracleにDATE列が実際にタイムスタンプであることを覚えておくことが重要ですので、日付は常にあると(ミリ秒またはマイクロ秒ではなく、秒単位で正確に表示されるため)、Oracle DATEを処理する場合は、常に時間/分/秒を考慮する必要があります。

幸運のベスト。

+0

**ないTO_DATEで**使用の月名() - 名前の正しい解析が_client」に依存s_言語設定。自分のコンピュータでクエリが失敗します。 –

+0

私はあなたの意見を理解しますが、敬意を表することはできません。 2013年11月12日は明白です。 11-12-13は...何ですか?プラスDD-MON-YYYYは米国の軍事フォーマットです。 30年以上前にその論理に慣れてきました。決して背中を振り返らない。エスペラントの月の名前を標準化できるのでしょうか?私はドイツのIIRCとほぼ同じように見えますが、英語の略語と2〜3つの違いに慣れる必要があるようです。 YMは間違いなくなりますV. :-) –

+0

まあ、私が言ったように: '11-DECを-2013'異なっ月(ドイツ語、スペイン語、イタリア語、ポーランド語や、より多くの)呪文_client_から実行した場合** **は失敗します - 曖昧でないかどうか。問題は、これはサーバーではなくクライアント*に依存することです。月を数字で書いた書式を使用する方が良いでしょう。また、 'to_date()'関数の書式マスクを指定した場合(常にとにかく)、あいまいではありません。例えば。 'to_date(' 01-12-2012 '、' dd-mm-yyyy ') '私は通常、国際的なISOフォーマットを使用しています。 '2012-12-01'(もちろん**フォーマットマスク付き**) –