Как я решил этот этап?
так же:
setTimeout((function(_deepFunction ,_deepData){
var _deepResultFunction = function _deepResultFunction(){
_deepFunction(_deepData);
};
return _deepResultFunction;
})(fromOuterFunction, fromOuterData ) , 1000 );
setTimeout ждать ссылки на функцию, поэтому я создал ее в закрытии, которое интерпретирует мои данные и возвращать функцию с хорошим экземпляром моих данных!
Возможно, вы можете улучшить эту часть:
_deepFunction(_deepData);
// change to something like :
_deepFunction.apply(contextFromParams , args);
Я протестировал ее на chrome, firefox и IE, и она хорошо работает, я не знаю о производительности, но мне нужно, чтобы он работал.
образец теста:
myDelay_function = function(fn , params , ctxt , _time){
setTimeout((function(_deepFunction ,_deepData, _deepCtxt){
var _deepResultFunction = function _deepResultFunction(){
//_deepFunction(_deepData);
_deepFunction.call( _deepCtxt , _deepData);
};
return _deepResultFunction;
})(fn , params , ctxt)
, _time)
};
// the function to be used :
myFunc = function(param){ console.log(param + this.name) }
// note that we call this.name
// a context object :
myObjet = {
id : "myId" ,
name : "myName"
}
// setting a parmeter
myParamter = "I am the outer parameter : ";
//and now let's make the call :
myDelay_function(myFunc , myParamter , myObjet , 1000)
// this will produce this result on the console line :
// I am the outer parameter : myName
Возможно, вы можете изменить подпись, чтобы сделать ее более уступчивой:
myNass_setTimeOut = function (fn , _time , params , ctxt ){
return setTimeout((function(_deepFunction ,_deepData, _deepCtxt){
var _deepResultFunction = function _deepResultFunction(){
//_deepFunction(_deepData);
_deepFunction.apply( _deepCtxt , _deepData);
};
return _deepResultFunction;
})(fn , params , ctxt)
, _time)
};
// and try again :
for(var i=0; i<10; i++){
myNass_setTimeOut(console.log ,1000 , [i] , console)
}
И окончательно ответить на исходный вопрос:
myNass_setTimeOut( postinsql, 4000, topicId );
Надеюсь, это поможет!
ps: извините, но английский это не мой родной язык!
Это намного более кратко:
where
datediff(day, date1, date2) = 0
Удостоверьтесь, что читали Только В Базе данных, Может Вы Получать 1 000% + Улучшение Путем Изменения Нескольких Строк Кода так, чтобы Вы были уверены, что оптимизатор может использовать индекс эффективно при питании с датами
В значительной степени необходимо сохранить левую сторону Вашего, где пункт убирает. Так, обычно, Вы сделали бы что-то как:
WHERE MyDateTime >= @activityDateMidnight
AND MyDateTime < (@activityDateMidnight + 1)
(Некоторые люди предпочитают DATEADD (d, 1, @activityDateMidnight) вместо этого - но это - то же самое).
таблица TimeZone усложняет ситуацию немного все же. Это немного неясно от Вашего отрывка, но это похоже на t. TheDateInTable находится в GMT с идентификатором Часового пояса, и что Вы тогда добавляете смещение для сравнения с @activityDateMidnight - который находится в местное время. Я не уверен что ds. LocalTimeZone, все же.
, Если это так, тогда необходимо получить @activityDateMidnight в GMT вместо этого.
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)
, который определенно использовал бы индекс - хотя у Вас есть небольшие издержки на ВСТАВКЕ и ОБНОВЛЕНИИ тогда.
это удалит компонент времени из даты Вас:
select dateadd(d, datediff(d, 0, current_timestamp), 0)
Относительно часовых поясов, все же еще одна причина сохранить все даты в единственном часовом поясе (предпочтительно UTC). Так или иначе я думаю, ответы с помощью datediff, datepart и различные встроенные функции даты являются лучшим выбором.
where
year(date1) = year(date2)
and month(date1) = month(date2)
and day(date1) = day(date2)
Вы испорчены для выбора с точки зрения опций здесь. При использовании Sybase или SQL Server 2008, можно создать переменные даты типа и присвоить им значения даты и времени. Механизм базы данных избавляется от времени для Вас. Вот быстрый и грязный тест для иллюстрирования (Код находится на диалекте Sybase):
declare @date1 date
declare @date2 date
set @date1='2008-1-1 10:00'
set @date2='2008-1-1 22:00'
if @date1=@date2
print 'Equal'
else
print 'Not equal'
Для SQL 2005 и ранее что можно сделать, является преобразованием дата к varchar в формате, который не имеет компонента времени. Например, следующие возвраты 22.08.2008
select convert(varchar,'2008-08-22 18:11:14.133',102)
102 части определяют форматирование (Книги онлайн могут перечислить для Вас все доступные форматы)
Так, что можно сделать, записать функцию, которая берет дату и время и извлекает элемент даты и отбрасывает время. Как так:
create function MakeDate (@InputDate datetime) returns datetime as
begin
return cast(convert(varchar,@InputDate,102) as datetime);
end
можно тогда использовать функцию для компаньонов
Select * from Orders where dbo.MakeDate(OrderDate) = dbo.MakeDate(DeliveryDate)
Eric Z Борода:
я действительно храню все даты в GMT. Вот вариант использования: что-то произошло в 23:00 EST на 1-м, которое является 2-м GMT. Я хочу видеть действие для 1-го, и я нахожусь в EST, таким образом, я захочу видеть действие 23:00. Если бы я просто сравнил необработанный GMT datetimes, я пропустил бы вещи. Каждая строка в отчете может представить действие от различного часового пояса.
Право, но когда Вы говорите, что интересуетесь действием для Jan 1-е 20:08 EST:
SELECT @activityDateMidnight = '1/1/2008', @activityDateTZ = 'EST'
просто необходимо преобразовать , что к GMT (я игнорирую сложность запросов для того, за день до того, как EST переходит к EDT, или наоборот):
Table: TimeZone
Fields: TimeZone, Offset
Values: EST, -4
--Multiply by -1, since we're converting EST to GMT.
--Offsets are to go from GMT to EST.
SELECT @activityGmtBegin = DATEADD(hh, Offset * -1, @activityDateMidnight)
FROM TimeZone
WHERE TimeZone = @activityDateTZ
, который должен дать Вам '01.01.2008 4:00'. Затем можно просто искать в GMT:
SELECT * FROM EventTable
WHERE
EventTime >= @activityGmtBegin --1/1/2008 4:00 AM
AND EventTime < (@activityGmtBegin + 1) --1/2/2008 4:00 AM
рассматриваемое событие снабжено GMT EventTime 02.01.2008 3:00. Вам даже не нужен TimeZone в EventTable (с этой целью, по крайней мере).
, Так как EventTime не находится в функции, это - прямое индексное сканирование - который должен быть довольно эффективным. Сделайте EventTime Вашим кластерным индексом, и это полетит.;)
Лично, у меня было бы приложение, преобразовывают время поиска в GMT прежде, чем выполнить запрос.
Я использовал бы dayofyear функцию datepart:
Select *
from mytable
where datepart(dy,date1) = datepart(dy,date2)
and
year(date1) = year(date2) --assuming you want the same year too
Посмотрите datepart ссылку здесь .