首先,我使用Derby,我讨厌,但我必须参与这个项目。我试图在一个非常简单的查询中回退特定年份并继续遇到错误。我希望有人能够指出我可能做错了什么。
select customer, transaction, year(paymentdate) as pmtdate, amount
from paymenttable
where pmtdate like '%2012%'
这似乎微不足道,但我无法正确执行上述查询。年(paymentdate)作为日期返回。任何建议将不胜感激。
谢谢!
答案 0 :(得分:2)
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