2015-01-18 2 views
0

Во-первых, я использую Derby, которого я ненавижу, но для этого проекта. Я пытаюсь отбросить конкретные годы в очень простом запросе и постоянно сталкиваться с ошибками. Я надеюсь, что кто-то здесь сможет указать, что я могу делать неправильно.SQL Derby get year

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

Это кажется тривиальным, но я не могу выполнить вышеуказанный запрос правильно. год (paymentdate) возвращается как дата. Любые рекомендации будут оценены.

Спасибо!

ответ

2

Year() как определено в Derby, всегда будет возвращать либо целое число, либо 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; 
+2

«* и SQL в целом *» не true. Стандарт SQL определяет 'extract' для этого: 'extract (year from some_date)'. В стандарте SQL нет функции 'year()'. Кроме того, вы не должны использовать 'like' для целых чисел для строк. правильным условием будет 'year (pmtdate) = 2012' –

+0

@a_horse_with_no_name Спасибо за clairification - отредактирован. Я знаю, что функции MySQL и MSSQL 'YEAR' выполняют точно то же самое и имеют типы возврата' int', и, таким образом, обобщили его в моей голове. И хотя 'LIKE' действительно для строк, существуют ли случаи, когда он не обновляет (как известно,) int? Хотя я, конечно, обычно использовал бы '=' в этом случае, я стараюсь быть великодушным в интерпретации других примеров - ''% 2012% ''может просто быть простой подставкой для более сложного сгенерированного условия. –

2

делает like на date колонке не имеет никакого смысла. like предназначен для строк не для дат.

Поскольку функция year() возвращает целое число (а не date) вы просто должны использовать надлежащее целое сравнение в вашем где предложение:

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

Вы не сказать, «ошибка» вы получили, но это скорее всего потому, что вы не можете использовать столбец псевдоним as pmtdate в ИНЕКЕ вы должны ссылаться на полное выражение, если не положить, что в производной таблице:.

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