Математическая формула для вычисления продолжительности вызова

Причина, по которой функция является значением foo, заключается в том, что в этой строке:

var foo;

Вы просто заявляете foo - это утверждение, которое ничего не делает.

Если вы на самом деле установите foo на что-то, например «FooBar»:

function foo() {
  console.log(8);
}

var foo = "FooBar";

console.log(foo);

It перезаписывает функцию, потому что, как показано в в этом вопросе , объявление чего-либо со значением var, которое является значением, приведет к тому, что это значение будет «поднято» наверх и, таким образом, является фактическим значением идентификатора. ,

7
задан Cade Roux 31 January 2009 в 02:34
поделиться

3 ответа

РЕДАКТИРОВАТЬ: дальнейшее упрощение и исправление ошибки

Нет с плавающей запятой и работал с каждой базой данных, к которой у меня есть доступ:

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)

Вы могли бы создать функцию как UDF или что-то еще, что позволяет ваша среда SQL очистить выбор.

Изменить: да, пол и смещение единицы позволяют избежать плавающей математики.

2
ответ дан 7 December 2019 в 05:30
поделиться

Я использовал бы:

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) )
2
ответ дан 7 December 2019 в 05:30
поделиться

Принятие международных столбцов:

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
4
ответ дан 7 December 2019 в 05:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: