Существует две причины использования псевдонимов таблицы.
первое является косметическим. Операторы легче записать, и возможно также легче читать, когда псевдонимы таблицы используются.
второе более независимо. Если таблица появляется несколько раз в ИЗ пункта, Вам нужны псевдонимы таблицы для хранения их отличными. Сам соединения распространены в случаях, где таблица содержит внешний ключ, который ссылается на первичный ключ той же таблицы.
Два примера: список сотрудников, который содержит supervisorID столбец, который ссылается на employeeID супервизора.
вторым является взрыв частей. Часто, это реализовано в отдельной таблице с тремя столбцами: ComponentPartID, AssemblyPartID и Количество. В этом случае не будет никого сам соединения, но часто будет три пути соединение между этой таблицей и двумя различными ссылками на таблицу Частей.
Это - хорошая привычка войти.
Я попытался реализовать простой (статический) класс, который имитирует некоторые шаблоны PHP strtotime
. Этот класс разработан, чтобы быть открытым для модификации (просто добавьте новый Matcher
через registerMatcher
):
public final class strtotime {
private static final List<Matcher> matchers;
static {
matchers = new LinkedList<Matcher>();
matchers.add(new NowMatcher());
matchers.add(new TomorrowMatcher());
matchers.add(new DateFormatMatcher(new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss z")));
matchers.add(new DateFormatMatcher(new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z")));
matchers.add(new DateFormatMatcher(new SimpleDateFormat("yyyy MM dd")));
// add as many format as you want
}
// not thread-safe
public static void registerMatcher(Matcher matcher) {
matchers.add(matcher);
}
public static interface Matcher {
public Date tryConvert(String input);
}
private static class DateFormatMatcher implements Matcher {
private final DateFormat dateFormat;
public DateFormatMatcher(DateFormat dateFormat) {
this.dateFormat = dateFormat;
}
public Date tryConvert(String input) {
try {
return dateFormat.parse(input);
} catch (ParseException ex) {
return null;
}
}
}
private static class NowMatcher implements Matcher {
private final Pattern now = Pattern.compile("now");
public Date tryConvert(String input) {
if (now.matcher(input).matches()) {
return new Date();
} else {
return null;
}
}
}
private static class TomorrowMatcher implements Matcher {
private final Pattern tomorrow = Pattern.compile("tomorrow");
public Date tryConvert(String input) {
if (tomorrow.matcher(input).matches()) {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_YEAR, +1);
return calendar.getTime();
} else {
return null;
}
}
}
public static Date strtotime(String input) {
for (Matcher matcher : matchers) {
Date date = matcher.tryConvert(input);
if (date != null) {
return date;
}
}
return null;
}
private strtotime() {
throw new UnsupportedOperationException();
}
}
Основное использование:
Date now = strtotime("now");
Date tomorrow = strtotime("tomorrow");
Wed Aug 12 22:18:57 CEST 2009 Thu Aug 13 22:18:57 CEST 2009
Например, давайте добавим сопоставление дней :
strtotime.registerMatcher(new Matcher() {
private final Pattern days = Pattern.compile("[\\-\\+]?\\d+ days");
public Date tryConvert(String input) {
if (days.matcher(input).matches()) {
int d = Integer.parseInt(input.split(" ")[0]);
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_YEAR, d);
return calendar.getTime();
}
return null;
}
});
, тогда вы можете написать:
System.out.println(strtotime("3 days"));
System.out.println(strtotime("-3 days"));
(теперь среда, 12 августа, 22:18:57 CEST 2009
)
Sat Aug 15 22:18:57 CEST 2009 Sun Aug 09 22:18:57 CEST 2009
Вы можете использовать для этого простой формат даты, но вы должны знать формат даты перед синтаксическим анализом строки. PHP попытается угадать это, Java ожидает, что вы явно скажете ему, что делать.
Пример:
SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
SimpleDateFormat formater = new SimpleDateFormat("MM/dd/yy");
Date d = parser.parse("2007-04-23 11:22:02");
System.out.println(formater.format(d));
Он выводит:
04/23/2007
SimpleDateFormat завершится ошибкой, если строка не в правильном формате, если вы не установите:
parser.setLenient(false);
В этом случае будет сгенерировано исключение java.text.ParseException.
Для предварительного форматирования используйте DateFormat и его многочисленные операторы .
Посмотрите JodaTime , я думаю, это лучшая библиотека datetime для java.
Используйте календарь и отформатируйте результат с помощью SimpleDateFormat:
http://java.sun.com/j2se/1.5.0/docs/api/java/util/Calendar.html
Calendar now = Calendar.getInstance();
Calendar working;
SimpleDateFormat formatter = new SimpleDateFormat("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
working = (Calendar) now.clone();
//strtotime("-2 years")
working.add(Calendar.DAY_OF_YEAR, - (365 * 2));
System.out.println(" Two years ago it was: " + formatter.format(working.getTime()));
working = (Calendar) now.clone();
//strtotime("+5 days");
working.add(Calendar.DAY_OF_YEAR, + 5);
System.out.println(" In five days it will be: " + formatter.format(working.getTime()));
Хорошо, он значительно более подробный, чем PHP strtotime (), но, в конце концов, это функциональность, которая вам нужна.
Насколько я знаю, ничего подобного не существует. Вам придется самому взломать один. Однако, возможно, в этом нет необходимости. Попробуйте сохранить даты как метки времени и просто выполните простые вычисления. Я так понимаю, это не так чисто, как вам хотелось бы. Но это сработает.