在Oracle SQL中使用日期

时间:2016-12-17 14:16:06

标签: sql oracle

我在使用SQL时非常新,我尝试做的是仅使用月份和年份选择waterUsage和electrcityUsage,并选择上一年的waterUsage和electrcityUsage。

然而,我似乎无法找出使用日期的合适方法,以使这项工作。

表: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*/

3 个答案:

答案 0 :(得分:4)

一个选项使用TO_CHAR

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

这假设您实际上使用的是Oracle,而不是SQL Server。

如果您想要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)

答案 1 :(得分:2)

假设billingdateDATE列。

您无法将DATE与字符串值进行比较。如果您只想比较日期的“部分”,则需要将日期转换为字符串:

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

但我强烈建议始终使用四位数年份:

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 总是包含时间(尽管数据类型的名称) )。将时间设置为00:00:00使用trunc()

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

答案 2 :(得分:0)

假设BILLINGDATE是DATE列:

我建议在这种情况下避免使用TO_CHAR或EXTRACT函数,因为它们可能会强制进行全表扫描 - 对于小型数据库和表来说可能不是问题,但在查询大型数据库和表时可能非常重要表。相反,我建议习惯使用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时考虑小时/分钟/秒。

祝你好运。