Вы не можете INSERT
войти в CTE. CTE - это логическая таблица, это псевдоним набора результатов. Вы можете SELECT
из CTE. Не совсем уверен, чего вы там добиваетесь.
ОШИБКА: отношение "matrix_cte" не существует
blockquote>Это сообщение об ошибке означает, что вы можете
INSERT
только в отношения (таблицы). CTE - это не таблица, это не постоянный объект в базе данных, и в вашей базе данных нет таблицы с именемmatrix_cte
.
Чтобы сгенерировать все отношения, как прямые, так и обратные, вы можете
UNION
два набора результатов вместе. Если ваша исходная таблица имеет только отношения в одном направлении, то вы можете использоватьUNION ALL
, и запрос будет быстрее. Я имею в виду, если исходная таблица никогда не имеет двух строк для одной и той же пары единиц:unit1, unit2, 1 unit2, unit1, 2
, тогда вы можете использовать
UNION ALL
ниже. Если в оригинальной таблице могут быть такие дубликаты, вы должны использоватьUNION
для удаления лишних дубликатов.-- all direct relationships as they are SELECT lookup_unit, lookup_unit_2, lookup_unit_relationship FROM register_unit_matrix UNION -- inverse all relationships SELECT lookup_unit_2, lookup_unit, CASE WHEN lookup_unit_relationship = 1 THEN 2 ELSE 1 END AS lookup_unit_relationship FROM register_unit_matrix
Вы можете поместить этот запрос выше в представление или использовать как есть.
Равенство дат зависит от того, что две даты равны миллисекунде. Создание нового объекта Date с использованием new Date ()
никогда не будет равняться дате, созданной в прошлом. API-интерфейсы Joda Time упрощают работу с датами; однако, используя только SDK Java:
if (removeTime(questionDate).equals(removeTime(today))
...
public Date removeTime(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
Я бы использовал JodaTime для этого. Вот пример - допустим, вы хотите найти разницу в днях между двумя датами.
DateTime startDate = new DateTime(some_date);
DateTime endDate = new DateTime(); //current date
Days diff = Days.daysBetween(startDate, endDate);
System.out.println(diff.getDays());
JodaTime можно скачать с здесь .
Мне непонятно, что вы хотите, но я упомяну, что класс Date также имеет метод compareTo , который можно использовать для определения одним вызовом, равны ли два объекта Date или (если они не равны), что происходит раньше.Это позволяет вам делать что-то вроде:
switch (today.compareTo(questionDate)) {
case -1: System.out.println("today is sooner than questionDate"); break;
case 0: System.out.println("today and questionDate are equal"); break;
case 1: System.out.println("today is later than questionDate"); break;
default: System.out.println("Invalid results from date comparison"); break;
}
Следует отметить, что документы API не гарантируют, что результаты будут -1, 0 и 1, поэтому вы можете использовать if-elses, а не переключатель в любом производственный код. Кроме того, если вторая дата равна нулю, вы получите исключение NullPointerException, поэтому может быть полезно заключить ваш код в try-catch.