Другой вариант - использовать условие, которое потенциально может использовать индекс для этого столбца:
where date >= timestamp '2018-01-01 00:00:00'
and date < timestamp '2019-01-01 00:00:00';
Если вы не хотите писать длинный «литерал метки времени» и просто передавать число к запросу вы можете использовать make_timestamp()
where date >= make_timestamp(2018,1,1,0,0,0)
and date < make_timestamp(2019,1,1,0,0,0);
Если это значение является параметром, который вы можете использовать:
where date >= make_timestamp(?,1,1,0,0,0)
and date < make_timestamp(? + 1,1,1,0,0,0);
Функция извлечения также будет работать: [ 119]
where extract(year from date)::int = 2018
или используя to_char ()
where to_char(date, 'yyyy') = '2018'
Попытка с помощью дженериков:
public static BaseClass Create<T>() where T : BaseClass, new()
{
T newVar = new T();
// Do something with newVar
return T;
}
Демонстрационное использование:
DerivedClass d = BaseClass.Create<DerivedClass>();
Существует две основных опции. Более хороший и более новый должен использовать дженерики, другой должен использовать отражение. Я предоставляю обоим в случае, если необходимо разработать решение, которое работает до.NET 2.0.
abstract class BaseClass
{
public static BaseClass Create<T>() where T : BaseClass, new()
{
return new T();
}
}
Где использование было бы:
DerivedClass derivedInstance = BaseClass.Create<DerivedClass>();
abstract class BaseClass
{
public static BaseClass Create(Type derivedType)
{
// Cast will throw at runtime if the created class
// doesn't derive from BaseClass.
return (BaseClass)Activator.CreateInstance(derivedType);
}
}
Где использование было бы (разделение по поводу двух строк для удобочитаемости):
DerivedClass derivedClass
= (DerivedClass)BaseClass.Create(typeof(DerivedClass));
Вы хотите создать новый экземпляр полученных из другого экземпляра полученных, с помощью статического метода фабрики для абстрактного базового класса? если так, интересно Почему... Но...
public abstract class MyBase
{
public static T GetNewDerived<T>() where T : MyBase, new()
{
return new T();
}
}
public class DerivedA : MyBase
{
public static DerivedA GetNewDerived()
{
return GetNewDerived<DerivedA>();
}
}
public class DerivedB : MyBase
{
public static DerivedB GetNewDerived()
{
return GetNewDerived<DerivedB>();
}
}
Это то, что Вы хотите?
Кажется, что необходимо сделать Создавание () краткий обзор метода. И после того как Вы делаете это, Вы могли бы также переименовать его и сделать его конструктором также. Затем у Вас может быть другой Init () метод, который Вы называете после того, как объект создается, если Вы должны, и нормальные эффекты полиморфизма обработают вещи.
Вы не можете сделать этого без внешней информации; или тип производного класса, экземпляр его или полностью определенное название производного класса. Любой из них эквивалентен тому, что Вы уже делаете; нет лучшего решения, о котором я знаю. Самая природа статических методов устраняет что-либо более изящное.
Я не уверен, что Ваши цели дизайна всего лишь, от какого Вы спросили, это кажется, что могло бы закончиться с большим количеством запаха кода. Я думаю, что необходимо действительно изучить Инверсию управления (IoC) / шаблоны разработки Внедрения зависимости (DI), которые реализованы в многочисленных платформах, таких как Microsoft Unity, замок Windsor, StructureMap, Ninject, Spring. Сеть и т.д.
Я думаю, смотрите ли Вы на использование контейнера МОК, оно решит Вашу проблему намного более чистым и слабо связанным способом.