Eric Z Борода:
дата действия предназначена для указания на зону местного времени, но не определенную
Хорошо - назад к исходной точке. Попробуйте это:
where t.TheDateINeedToCheck BETWEEN (
dateadd(hh, (tz.Offset + ISNULL(ds.LocalTimeZone, 0)) * -1, @ActivityDate)
AND
dateadd(hh, (tz.Offset + ISNULL(ds.LocalTimeZone, 0)) * -1, (@ActivityDate + 1))
)
, который переведет @ActivityDate в местное время и выдержит сравнение с этим. Это - Ваша лучшая возможность для использования индекса, хотя я не уверен, что это будет работать - необходимо попробовать его и проверить план запросов.
следующая опция была бы индексным представлением с индексируемым, вычисленным TimeINeedToCheck в местное время . Тогда Вы просто возвращаетесь к:
where v.TheLocalDateINeedToCheck BETWEEN @ActivityDate AND (@ActivityDate + 1)
, который определенно использовал бы индекс - хотя у Вас есть небольшие издержки на ВСТАВКЕ и ОБНОВЛЕНИИ тогда.
Да, Oracle NUMBER типы точны. Они больше похожи на целые числа с масштабом, чем на типы float / double. Итак, ЧИСЛО (10,3) состоит из 10 цифр, 3 после десятичной точки, что на самом деле является 10-значным целым числом со шкалой 3. Фактически, именно так работает Java BigDecimals (будучи BigInteger плюс внутренняя шкала).
Oracle гарантирует точность 38 цифр в ЧИСЛЕ, хотя 40 может быть представлено. См. Справочную информацию в Oracle Concepts .
Oracle NUMBER
типы хранятся как наборы сотенных цифр (то есть основание 100
, а не основание 10
), один цифра на байт.
Первый байт представляет показатель степени, другие байты представляют мантиссу.
Это означает, что для очень больших чисел даже целые числа могут быть округлены:
SELECT 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
FROM dual
---
0