![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
EndOfTheDay... [D7]
istok © (2011-04-23 00:08:00)функция EndOfTheDay и даже самописный, более мягкий и неточный вариант в виде RecodeTime(AValue, 23, 59, 59, 0) иногда возвращают не конец переданного дня, а начало следующего...
не могу понять в чем дело, может если где-то в коде используется real а не datetime (который есть более большой тип extended) то часть мантиссы может обрезаться и день округлится до слудеющего дня??
причем этот глюк то есть, то нет.. какие-то особенности работы с плавающей запятой?
sniknik (2011-04-24 10:36:00) [1]> и получается что вариант с RecodeTime(AValue, 23, 59, 59, 0) должен был работать?
вот тут - секунда... причем вполне рабочий вариант даже с простым временем в mssgl с его дискретностью в миллисекундах (это запишется точно), правда есть вероятность потерять значения... (их есть еще целых 3 между 59 сек и 0 следующего дня)
> не тут собака порылась, явно
она там явно порылась даже не в одном месте... кучки свои закапывала... :)
ов (дом) (2011-04-24 08:19:00) [2]явно отнять одну секунду - будет одна секунда
Германн (2011-04-24 01:08:00) [3]
> не тут собака порылась, явно
> там миллисекунд, а тут целая секунда..
>
Где тут "целая секунда"?
ов (дом) (2011-04-24 00:00:00) [4]
> StartOfTheDay никогда не использовал, всегда Trunc писал.
я тоже, пока не нарвался на вопли о том что , дескать, хочу время, а ты мне число суешь. И довольно нечитаемо переубедить было через явное приведение.
> именно в него потом передаю эти даты для фильтрации!! и
> получаю лишние данные...
не тут собака порылась, явно
там миллисекунд, а тут целая секунда..
Anatoly Podgoretsky (2011-04-23 18:29:00) [5]Его партизанские замашки, то его проблема.
sniknik (2011-04-23 18:15:00) [6]> так что использовать наверняка для ms sql?
ms sql 2008 + расширенный тип даты (читал там есть, но т.к. не стоит/не использовал, то конкретики не знаю) - variant в передаче значений, т.к. D7, и будет приводится к ближайшему типу с ограничениями.
> Я же написал, использовать отношение меньше и никаких ошибок
так он может не сравнивает, может само значение сохраняет с точностью "тютелька в тютельку"...
Anatoly Podgoretsky (2011-04-23 16:46:00) [7]> istok (23.04.2011 15:37:15) [15]
Ты чего не читатель?
Я же написал, использовать отношение меньше и никаких ошибок
istok (2011-04-23 15:37:00) [8]
> > Особенно на MS SQL где точность всего 3 мс
>
> Там не просто 3 ms, там строго окончание datetime 0, 3 и
> 7.
именно в него потом передаю эти даты для фильтрации!! и получаю лишние данные...
так что использовать наверняка для ms sql?
и получается что вариант с RecodeTime(AValue, 23, 59, 59, 0) должен был работать?
Ega23 (2011-04-23 14:45:00) [9]
> Особенно на MS SQL где точность всего 3 мс
Там не просто 3 ms, там строго окончание datetime 0, 3 и 7.
Anatoly Podgoretsky (2011-04-23 14:27:00) [10]Особенно на MS SQL где точность всего 3 мс
Anatoly Podgoretsky (2011-04-23 14:24:00) [11]> Inovet (23.04.2011 13:42:11) [11]
А я всегда X < StartOfTheDay + 1 или Trunc(AnyDate) + 1
Никаких проблем с округлением
Inovet (2011-04-23 13:42:00) [12]> [7] sniknik © (23.04.11 13:22)
> что стандартные функции "глючат"... а где то рядом.
Так известно же, что десятичное представление точно не соответсвует двоичному. И про эти функции в той или ещё в одной статье про округление было сказано.
Ega23 (2011-04-23 13:42:00) [13]
> а фига-ли EndOfTheDay не работает
А это "родная" функция что-ли?
Если честно - никогда не пользовался. Да и StartOfTheDay никогда не использовал, всегда Trunc писал.
sniknik (2011-04-23 13:32:00) [14]> С фига-ли Single-то?
а фига-ли EndOfTheDay не работает? вот это пример. щщасте с TDateTime нужно не мне, а автору.
Ega23 (2011-04-23 13:28:00) [15]
function Foo(DateIn: TDateTime): Single;
С фига-ли Single-то? Замени на TDateTime и будет тебе щщасте
sniknik (2011-04-23 13:22:00) [16]>
Result := IncMillisecond(StartOfTheDay(DateIn) + 1, -1);
проверка... ;)
procedure TForm1.Button1Click(Sender: TObject);
function Foo(DateIn: TDateTime): Single;
begin
result:= IncMillisecond(StartOfTheDay(DateIn) + 1, -1);
end;
begin
ShowMessage(DateTimeToStr(Foo(Now())));
end;
p.s. ничего не поможет, т.к. проблема вовсе не в том что стандартные функции "глючат"... а где то рядом.
Ega23 (2011-04-23 12:33:00) [17]
Result := IncMillisecond(StartOfTheDay(DateIn) + 1, -1);
ов (дом) (2011-04-23 12:28:00) [18]оказывается, и футболист есть такой 6)
"Неочевидные особенности вещественных чисел"
вот как
> result := TdateTime(StartOfTheDay(in) + 1 - 1/(24*60*60))
т.е. от следующего дня отнять секунду
Германн (2011-04-23 02:03:00) [19]
> EndOfTheDay... [D7]
>
> istok (23.04.11 00:08)
>
> функция EndOfTheDay и даже самописный, более мягкий и неточный
> вариант в виде RecodeTime(AValue, 23, 59, 59, 0) иногда
> возвращают не конец переданного дня, а начало следующего.
> ..
>
Или я чего-то не понял, или кто-то из нас двоих бредит. Думаю, что всё-таки вы. :)
P.S. И не надо будить Антона Григорьева!
ов (дом) (2011-04-23 01:19:00) [20]
> какие-то особенности работы с плавающей запятой?
>
вероятно, Антона Григорьева почитайте, погуглите
delphi нет под рукой, а если так примерно написать?
EndOfTheDay2(in:TDAteTime):TDAteTime;
result := TdateTime(StartOfTheDay(in) + 1 - 1/(60*60))