Какой хороший способ проверить, находятся ли два datetime в один и тот же календарный день в TSQL?

Как я решил этот этап?

так же:

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: извините, но английский это не мой родной язык!

22
задан Rikalous 22 July 2010 в 11:21
поделиться

10 ответов

Это намного более кратко:

where 
  datediff(day, date1, date2) = 0
61
ответ дан 22 July 2010 в 11:21
поделиться

Удостоверьтесь, что читали Только В Базе данных, Может Вы Получать 1 000% + Улучшение Путем Изменения Нескольких Строк Кода так, чтобы Вы были уверены, что оптимизатор может использовать индекс эффективно при питании с датами

3
ответ дан SQLMenace 22 July 2010 в 11:21
поделиться

В значительной степени необходимо сохранить левую сторону Вашего, где пункт убирает. Так, обычно, Вы сделали бы что-то как:

WHERE MyDateTime >= @activityDateMidnight 
      AND MyDateTime < (@activityDateMidnight + 1)

(Некоторые люди предпочитают DATEADD (d, 1, @activityDateMidnight) вместо этого - но это - то же самое).

таблица TimeZone усложняет ситуацию немного все же. Это немного неясно от Вашего отрывка, но это похоже на t. TheDateInTable находится в GMT с идентификатором Часового пояса, и что Вы тогда добавляете смещение для сравнения с @activityDateMidnight - который находится в местное время. Я не уверен что ds. LocalTimeZone, все же.

, Если это так, тогда необходимо получить @activityDateMidnight в GMT вместо этого.

19
ответ дан Mark Brackett 22 July 2010 в 11:21
поделиться
  • 1
    OP заявила, что это был фиксированный шрифт, как Courier New. – Quibblesome 23 December 2008 в 14:26

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)

, который определенно использовал бы индекс - хотя у Вас есть небольшие издержки на ВСТАВКЕ и ОБНОВЛЕНИИ тогда.

1
ответ дан Mark Brackett 22 July 2010 в 11:21
поделиться

это удалит компонент времени из даты Вас:

select dateadd(d, datediff(d, 0, current_timestamp), 0)
1
ответ дан AlexCuse 22 July 2010 в 11:21
поделиться

Относительно часовых поясов, все же еще одна причина сохранить все даты в единственном часовом поясе (предпочтительно UTC). Так или иначе я думаю, ответы с помощью datediff, datepart и различные встроенные функции даты являются лучшим выбором.

0
ответ дан Tundey 22 July 2010 в 11:21
поделиться
where
year(date1) = year(date2)
and month(date1) = month(date2)
and day(date1) = day(date2)
4
ответ дан jason saldo 22 July 2010 в 11:21
поделиться

Вы испорчены для выбора с точки зрения опций здесь. При использовании 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)
1
ответ дан Rad 22 July 2010 в 11:21
поделиться

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 прежде, чем выполнить запрос.

2
ответ дан Mark Brackett 22 July 2010 в 11:21
поделиться

Я использовал бы 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 ссылку здесь .

0
ответ дан brendan 22 July 2010 в 11:21
поделиться
Другие вопросы по тегам:

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