SQL Derby得到了一年

时间:2015-01-18 21:10:54

标签: sql derby

首先,我使用Derby,我讨厌,但我必须参与这个项目。我试图在一个非常简单的查询中回退特定年份并继续遇到错误。我希望有人能够指出我可能做错了什么。

select customer, transaction, year(paymentdate) as pmtdate, amount
from paymenttable
where pmtdate like '%2012%'

这似乎微不足道,但我无法正确执行上述查询。年(paymentdate)作为日期返回。任何建议将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:2)

Derby中定义的

Year()将始终返回一个整数或null - 否则它没有多大意义。所以你的陈述至少要从中得到一个int。

问题通常来自WHERE子句,而不是“查找”选择表达式中的pmtdate列。有两种可能的解决方案:

如果您需要将年份放在返回的行中,只需将WHERE条款换成HAVING个:

SELECT customer, transaction, YEAR(paymentdate) AS pmtdate, amount
    FROM paymenttable
    HAVING pmtdate = 2012;

HAVING技术上适用于群组,但实际上它适用于分组完成后返回的行,此时您的pmtdate列“存在”以供引擎查找。 WHERE适用于表格旁边的行,因此YEAR()函数在那里进行得太晚了。

或者,如果您只需要在查询中使用年份作为限制因素,则结果不需要:

SELECT customer, transaction, paymentdate, amount
    FROM paymenttable
    WHERE YEAR(paymentdate) = 2012;

答案 1 :(得分:2)

like列上执行date毫无意义。 like用于不是日期的字符串。

由于year()函数返回一个整数(不是date),你只需要在where子句中使用正确的整数比较:

select customer, transaction, paymentdate, amount
from paymenttable
where year(paymentdate) = 2012

你没有说出你遇到了哪个“错误”,但很可能是因为你不能在where子句中使用列别名as pmtdate。除非将其放入派生表中,否则需要引用完整表达式:

select * 
from (
   select customer, transaction, year(paymentdate) as pmtdate, amount
  from paymenttable
) t
where pmtdate = 2012