select distinct
- это оператор, который гарантирует, что в результирующем наборе нет повторяющихся строк . То есть он отфильтровывает строки, в которых каждый столбец одинаков (а значения NULL
считаются равными).
Он не смотрит на подмножество столбцов.
Иногда люди используют select distinct
и не понимают, что это относится ко всем столбцам. Довольно забавно, когда первый столбец в круглых скобках - как будто круглые скобки имеют значение (они этого не делают).
Тогда у вас могут возникнуть ситуации, когда значения выглядят одинаково, но это не так.
Рассмотрим этот простой пример, где значения отличаются только пробелом в качестве конца строки:
select distinct x
from (select 'a' as x union all
select 'a '
) y;
Здесь - это скрипта db <> с этим примером.
Это возвращает две строки, а не 1.
Без примеров данных трудно сказать, на какую из этих ситуаций вы ссылаетесь. Но строки, которые вы считаете «идентичными», на самом деле не совпадают.
Есть ли более простой способ
Может быть что-то вроде этого:
boost::this_thread::sleep(boost::posix_time::seconds(1));
boost::thread::sleep(boost::posix_time::seconds(1));
boost :: xtime_get ()
выглядит как один из немногих API-интерфейсов Boost, который не реализован в заголовке, поэтому это может быть что-то вроде неправильной компиляции библиотеки Boost. Это, вероятно, похоже на несовпадение соглашений о вызовах или что-то в этом роде. Я не знаю, в первую очередь, какие шаги вам могут понадобиться, чтобы перестроить библиотеку - все, что я когда-либо использовал в Boost, это вещи, которые требуют только заголовки.
Это может быть полезно, если вы просто проследите в процедуру xtime_get ()
, даже если она находится на уровне сборки. Структура xtime
очень, очень проста, и xtime_get ()
на самом деле ничего не делает, кроме как вызывает специфичный для платформы API, чтобы получить числа для подключения к xtime
структура.
С этим кодом (не зная, например, где вы его поместили), все, что я могу сказать, это то, что xtime_get Метод
возвращает тип возвращаемой меры. То есть, вы должны быть уверены, например, в том, что справедливо следующее утверждение:
int res = boost::xtime_get(&xt, boost::TIME_UTC);
assert(res == boost::TIME_UTC);
Может случиться, что в вашей системе это не так.
Однако, посмотрев на код еще раз, мне приходит в голову, что сбой может быть связан не с этим вызовом, а с другими вещами, которые вы делаете в своем приложении. Опять же, это зависит от того, где вы используете этот код. Это внутри оператора ()
вашего потока?