我在使用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*/
答案 0 :(得分:4)
一个选项使用TO_CHAR
:
select electrcityUsage, waterUsage
from monthlyBill
where accountNumber = '211' and
to_char(billing_date, 'MM-YYYY') = '12-2012'
这假设您实际上使用的是Oracle,而不是SQL Server。
如果您想要2012
和2011
,那么请继续向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)
假设billingdate
是DATE
列。
您无法将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时考虑小时/分钟/秒。
祝你好运。