SQLDerbyGetYear
首先,我正在使用Derby,我讨厌它,但我必须为这个项目使用它。我试图在一个非常简单的查询中回溯特定的年份,并不断遇到错误。我希望这里有人能指出我可能做错了什么SQLDerbyGetYear,sql,derby,Sql,Derby,首先,我正在使用Derby,我讨厌它,但我必须为这个项目使用它。我试图在一个非常简单的查询中回溯特定的年份,并不断遇到错误。我希望这里有人能指出我可能做错了什么 select customer, transaction, year(paymentdate) as pmtdate, amount from paymenttable where pmtdate like '%2012%' 这看起来微不足道,但我无法正确执行上述查询。年份(paymentdate)作为日期返回。如有任何建议,将不胜感
select customer, transaction, year(paymentdate) as pmtdate, amount
from paymenttable
where pmtdate like '%2012%'
这看起来微不足道,但我无法正确执行上述查询。年份(paymentdate)作为日期返回。如有任何建议,将不胜感激
谢谢大家! 在Derby中定义的将始终返回整数或null-否则返回没有多大意义。所以你的语句至少从中得到了一个int
问题通常来自于WHERE
子句未在select表达式中“查找”pmtdate
列。有两种可能的解决方案:
如果您需要年份在返回行中,只需将WHERE
子句替换为HAVING
一个:
SELECT customer, transaction, YEAR(paymentdate) AS pmtdate, amount
FROM paymenttable
HAVING pmtdate = 2012;
have
技术上对组有效,但有效地对分组完成后返回的行有效,此时引擎将查找pmtdate
列“存在”WHERE
直接作用于表外的行,因此YEAR()
函数进入该行太晚了
或者,如果您只需要在查询中使用年份作为限制因素,而结果不需要:
SELECT customer, transaction, paymentdate, amount
FROM paymenttable
WHERE YEAR(paymentdate) = 2012;
正如Derby中定义的那样,它总是返回整数或null,否则就没有什么意义了。所以你的语句至少从中得到了一个int
问题通常来自于WHERE
子句未在select表达式中“查找”pmtdate
列。有两种可能的解决方案:
如果您需要年份在返回行中,只需将WHERE
子句替换为HAVING
一个:
SELECT customer, transaction, YEAR(paymentdate) AS pmtdate, amount
FROM paymenttable
HAVING pmtdate = 2012;
have
技术上对组有效,但有效地对分组完成后返回的行有效,此时引擎将查找pmtdate
列“存在”WHERE
直接作用于表外的行,因此YEAR()
函数进入该行太晚了
或者,如果您只需要在查询中使用年份作为限制因素,而结果不需要:
SELECT customer, transaction, paymentdate, amount
FROM paymenttable
WHERE YEAR(paymentdate) = 2012;
在
日期
列上执行类似的操作毫无意义like
用于字符串而不是日期
由于year()
函数返回一个整数(不是date)
您只需在where子句中使用适当的整数比较:
select customer, transaction, paymentdate, amount
from paymenttable
where year(paymentdate) = 2012
您没有说明出现了哪个“错误”,但很可能是因为在where子句中不能将列别名用作pmtdate
。您需要引用完整表达式,除非将其放入派生表中:
select *
from (
select customer, transaction, year(paymentdate) as pmtdate, amount
from paymenttable
) t
where pmtdate = 2012
在日期
列上执行类似的操作毫无意义like
用于字符串而不是日期
由于year()
函数返回一个整数(不是date)
您只需在where子句中使用适当的整数比较:
select customer, transaction, paymentdate, amount
from paymenttable
where year(paymentdate) = 2012
您没有说明出现了哪个“错误”,但很可能是因为在where子句中不能将列别名用作pmtdate
。您需要引用完整表达式,除非将其放入派生表中:
select *
from (
select customer, transaction, year(paymentdate) as pmtdate, amount
from paymenttable
) t
where pmtdate = 2012
“和SQL一般”不是真的。SQL标准为此定义了extract
函数:extract(从某个日期算起的年份)
。SQL标准中没有year()
函数。另外,你不应该像对待整数那样使用,而是对待字符串。正确的条件应该是年份(pmtdate)=2012
@a_horse_,名称为_no_,谢谢你的提示-编辑。我知道MySQL和MSSQLYEAR
函数的功能完全相同,并且具有int
返回类型,因此在我的脑海中对其进行了概括。虽然像
这样的确实适用于字符串,但有没有实例表明它不重铸(已知的)int?虽然在这种情况下我通常会使用=
,但我会尽量慷慨地解释其他人的例子-'%2012%'
可能只是一个更复杂的生成条件的简单替身。“一般来说SQL”是不正确的。SQL标准为此定义了extract
函数:extract(从某个日期算起的年份)
。SQL标准中没有year()
函数。另外,你不应该像对待整数那样使用,而是对待字符串。正确的条件应该是年份(pmtdate)=2012
@a_horse_,名称为_no_,谢谢你的提示-编辑。我知道MySQL和MSSQLYEAR
函数的功能完全相同,并且具有int
返回类型,因此在我的脑海中对其进行了概括。虽然像
这样的确实适用于字符串,但有没有实例表明它不重铸(已知的)int?在这种情况下,我通常会使用=
,但我会尽量慷慨地解释其他人的例子-'%2012%'
可能只是更复杂生成条件的简单替代品。