Попробуйте использовать TRUNC
и TO_DATE
вместо
WHERE
TRUNC(start_ts) = TO_DATE('2016-05-13', 'YYYY-MM-DD')
. Вместо этого вы можете использовать >=
и <
, чтобы избежать использования функции в столбце start_ts
:
WHERE
start_ts >= TO_DATE('2016-05-13', 'YYYY-MM-DD')
AND start_ts < TO_DATE('2016-05-14', 'YYYY-MM-DD')
const T
и T const
идентичны. С типами указателей это становится более сложным:
const char*
указатель на константу char
char const*
, указатель на константу char
char* const
, постоянный указатель на (изменяемому) char
, Другими словами, (1) и (2) идентичны. Единственный способ сделать указатель (а не пуант) const
состоит в том, чтобы использовать суффикс - const
.
Поэтому многие люди предпочитают всегда помещать const
в правую сторону типа (стиль “East const”): это делает свое местоположение относительно типа последовательным и легким помнить (это также анекдотическим образом, кажется, облегчает преподавать новичкам).
Прием должен считать объявление назад (справа налево):
const int a = 1; // read as "a is an integer which is constant"
int const a = 1; // read as "a is a constant integer"
Оба - то же самое. Поэтому:
a = 2; // Can't do because a is constant
чтение назад обманывает, особенно пригождается, когда Вы имеете дело с более сложными объявлениями, такими как:
const char *s; // read as "s is a pointer to a char that is constant"
char c;
char *const t = &c; // read as "t is a constant pointer to a char"
*s = 'A'; // Can't do because the char is constant
s++; // Can do because the pointer isn't constant
*t = 'A'; // Can do because the char isn't constant
t++; // Can't do because the pointer is constant
Нет никакого различия. Они оба объявляют, что "a" целое число, которое не может быть изменено.
место, где различия начинают появляться, - при использовании указателей.
Оба из них:
const int *a
int const *a
объявляют, что "a" указатель на целое число, которое не изменяется. "a" можно присвоить, но "*a" не может.
int * const a
объявляет, что "a" постоянный указатель на целое число. "*a" можно присвоить, но "a" не может.
const int * const a
объявляет, что "a" постоянный указатель на постоянное целое число. Ни "a", ни "*a" нельзя присвоить.
static int one = 1;
int testfunc3 (const int *a)
{
*a = 1; /* Error */
a = &one;
return *a;
}
int testfunc4 (int * const a)
{
*a = 1;
a = &one; /* Error */
return *a;
}
int testfunc5 (const int * const a)
{
*a = 1; /* Error */
a = &one; /* Error */
return *a;
}
Prakash корректен, что объявления являются тем же, хотя немного больше объяснения случая указателя могло бы быть в порядке.
"интервал константы* p" является указателем на интервал, который не позволяет интервалу быть измененным через тот указатель. "интервал* константа p" является указателем на интервал, который не может быть изменен для указания на другой интервал
, См. http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.5 .
const int
идентично int const
, как верно со всеми скалярными типами в C. В целом объявление параметра скалярной функции как const
не нужно, начиная с семантики вызова по значению C, средней, что любые изменения в переменной локальны для ее функции включения.
Это не прямой ответ, а связанная подсказка. Для хранения вещей прямо я всегда использую конвекцию, "помещает const
на внешнюю сторону", где "внешней стороной" я имею в виду крайне левое или крайнее правое. Тем путем там не является никакой беспорядок - константа относится к самой близкой вещи (или тип или *
). Например,
int * const foo = ...; // Pointer cannot change, pointed to value can change
const int * bar = ...; // Pointer can change, pointed to value cannot change
int * baz = ...; // Pointer can change, pointed to value can change
const int * const qux = ...; // Pointer cannot change, pointed to value cannot change
Да, они - то же всего для int
и отличающийся для int*
Я думаю в этом случае, что они - то же, но вот пример, где порядок имеет значение:
const int* cantChangeTheData;
int* const cantChangeTheAddress;