Причина, по которой функция является значением foo
, заключается в том, что в этой строке:
var foo;
Вы просто заявляете foo
- это утверждение, которое ничего не делает.
Если вы на самом деле установите foo
на что-то, например «FooBar»:
function foo() {
console.log(8);
}
var foo = "FooBar";
console.log(foo);
It перезаписывает функцию, потому что, как показано в в этом вопросе , объявление чего-либо со значением var
, которое является значением, приведет к тому, что это значение будет «поднято» наверх и, таким образом, является фактическим значением идентификатора. ,
РЕДАКТИРОВАТЬ: дальнейшее упрощение и исправление ошибки Нет с плавающей запятой и работал с каждой базой данных, к которой у меня есть доступ: Результат: Вы могли бы создать функцию как UDF или что-то еще, что позволяет ваша среда SQL очистить выбор. Изменить: да, пол и смещение единицы позволяют избежать плавающей математики. create table calls (t1 int, t2 int, rct int, cd int)
insert into calls (t1, t2, rct, cd)
values (60, 10, 48, 60)
insert into calls (t1, t2, rct, cd)
values (60, 10, 65, 70)
insert into calls (t1, t2, rct, cd)
values (60, 10, 121, 130)
insert into calls (t1, t2, rct, cd)
values (30, 20, 25, 30)
insert into calls (t1, t2, rct, cd)
values (30, 20, 35, 50)
insert into calls (t1, t2, rct, cd)
values (30, 20, 65, 70)
--Additional test to show that it works
insert into calls (t1, t2, rct, cd)
values (60, 10, 70, 70)
select t1, t2, rct, cd,
t1 + case when rct <= t1
then 0
else ( (rct-1-t1) / t2 + 1) * t2 end as CalceCD
from calls
t1 t2 rct cd CalceCD
----------- ----------- ----------- ----------- -----------
60 10 48 60 60
60 10 65 70 70
60 10 121 130 130
30 20 25 30 30
30 20 35 50 50
30 20 65 70 70
60 10 70 70 70
(6 row(s) affected)
Я использовал бы:
t1 + t2*ceiling( (rct - t1 + abs(rct - t1))*1.00/(2*t2) )
Или:
t1 + t2*ceiling( Cast((rct - t1 + abs(rct - t1)) as float)/(2*t2) )
Принятие международных столбцов:
SELECT t1
,t2
,RCT
CASE
WHEN RCT < t1
THEN t1
ELSE
t1 + t2 * ((RCT - t1) / t2 + SIGN((RCT - t1) % t2))
END AS CD
Но я предполагаю, что существует все еще один СЛУЧАЙ, позвольте мне видеть, могу ли я избавиться от него.
Только с целочисленной арифметикой (все еще ANSI):
SELECT t1
,t2
,RCT
,CD
,t1 + SIGN(RCT / t1) * t2 * ((RCT - t1) / t2 + SIGN((RCT - t1) % t2)) AS CalcCD
FROM Calls