Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLDerbyGetYear_Sql_Derby - Fatal编程技术网

SQLDerbyGetYear

SQLDerbyGetYear,sql,derby,Sql,Derby,首先,我正在使用Derby,我讨厌它,但我必须为这个项目使用它。我试图在一个非常简单的查询中回溯特定的年份,并不断遇到错误。我希望这里有人能指出我可能做错了什么 select customer, transaction, year(paymentdate) as pmtdate, amount from paymenttable where pmtdate like '%2012%' 这看起来微不足道,但我无法正确执行上述查询。年份(paymentdate)作为日期返回。如有任何建议,将不胜感

首先,我正在使用Derby,我讨厌它,但我必须为这个项目使用它。我试图在一个非常简单的查询中回溯特定的年份,并不断遇到错误。我希望这里有人能指出我可能做错了什么

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和MSSQL
YEAR
函数的功能完全相同,并且具有
int
返回类型,因此在我的脑海中对其进行了概括。虽然像
这样的
确实适用于字符串,但有没有实例表明它不重铸(已知的)int?虽然在这种情况下我通常会使用
=
,但我会尽量慷慨地解释其他人的例子-
'%2012%'
可能只是一个更复杂的生成条件的简单替身。“一般来说SQL”是不正确的。SQL标准为此定义了
extract
函数:
extract(从某个日期算起的年份)
。SQL标准中没有
year()
函数。另外,你不应该像对待整数那样使用
,而是对待字符串。正确的条件应该是
年份(pmtdate)=2012
@a_horse_,名称为_no_,谢谢你的提示-编辑。我知道MySQL和MSSQL
YEAR
函数的功能完全相同,并且具有
int
返回类型,因此在我的脑海中对其进行了概括。虽然像
这样的
确实适用于字符串,但有没有实例表明它不重铸(已知的)int?在这种情况下,我通常会使用
=
,但我会尽量慷慨地解释其他人的例子-
'%2012%'
可能只是更复杂生成条件的简单替代品。