По умолчанию findOneAndUpdate возвращает исходный документ. Если вы хотите, чтобы он возвратил измененный документ, передайте объект опций { new: true }
в функцию:
Cat.findOneAndUpdate({ age: 17 }, { $set: { name: "Naomi" } }, { new: true }, function(err, doc) {
});
это очень плохо для производительности, смотрите на Только В Базе данных, Может Вы Получать 1 000% + Улучшение Путем Изменения Нескольких Строк Кода
, функции на левой стороне оператора плохи
, вот то, что необходимо сделать
declare @d datetime
select @d = '2008-12-1 14:30:12'
where tstamp >= dateadd(dd, datediff(dd, 0, @d)+0, 0)
and tstamp < dateadd(dd, datediff(dd, 0, @d)+1, 0)
Выполнение это для наблюдения то, что это делает
select dateadd(dd, datediff(dd, 0, getdate())+1, 0)
select dateadd(dd, datediff(dd, 0, getdate())+0, 0)
WHERE DATEDIFF(day, tstamp, @dateParam) = 0
Это должно получить Вас там, если Вы не заботитесь во время.
Это должно ответить на meta вопрос сравнения дат двух значений, когда Вы не заботитесь во время.
Да, T-SQL может чувствовать себя чрезвычайно примитивным время от времени, и это - вещи как они, что часто времена продвигают меня к выполнению большой моей логики на моем предпочтительном языке (таком как C#).
Однако, когда абсолютно необходимо сделать некоторые из этих вещей в SQL по причинам производительности, тогда лучший выбор состоит в том, чтобы создать функции для корпуса этих "алгоритмов".
Смотрят на эту статью. Он предлагает довольно много удобных функций SQL вдоль этих строк, что я думаю, поможет Вам.
http://weblogs.sqlteam.com/jeffs/archive/2007/01/02/56079.aspx
Функции Даты, отправленные другими, являются самым корректным способом обработать это.
Однако это забавно, Вы упоминаете термин "пол", потому что существует немного взлома, который будет работать несколько быстрее:
CAST(FLOOR(CAST(@dateParam AS float)) AS DateTime)
DATEADD(d, 0, DATEDIFF(d, 0, [tstamp]))
Редактирование: В то время как это удалит часть времени Вашей даты и времени, она также сделает условие не SARGable. Если это важно для этого запроса, индексное представление или между пунктом является более соответствующим.
При использовании SQL Server 2008, этому встроили это теперь, посмотрите это в книги онлайн
CAST(GETDATE() AS date)
Осторожный здесь при использовании чего-нибудь длинное строки WHERE CAST(CONVERT(VARCHAR, [tstamp], 102) AS DATETIME) = @dateParam
это вызовет сканирование на таблице, и никакие индексы не будут использоваться для той части.
А намного более чистый способ сделать это определяет вычисляемый столбец
create table #t (
d datetime,
d2 as
cast (datepart(year,d) as varchar(4)) + '-' +
right('0' + cast (datepart(month,d) as varchar(2)),2) + '-' +
right('0' + cast (datepart(day,d) as varchar(2)),2)
)
-- notice a lot of care need to be taken to ensure the format is comparable. (zero padding)
insert #t
values (getdate())
create index idx on #t(d2)
select d2, count(d2) from #t
where d2 between '2008-01-01' and '2009-01-22'
group by d2
-- index seek is used
Таким образом, можно непосредственно проверить d2 столбец, и индекс будет использоваться, и Вы не должны слоняться без дела с преобразованиями.
Вот запрос, который возвратит все результаты в диапазоне дней.
DECLARE @startDate DATETIME
DECLARE @endDate DATETIME
SET @startDate = DATEADD(day, -30, GETDATE())
SET @endDate = GETDATE()
SELECT *
FROM table
WHERE dateColumn >= DATEADD(day, DATEDIFF(day, 0, @startDate), 0)
AND dateColumn < DATEADD(day, 1, DATEDIFF(day, 0, @endDate))
FWIW, я делал то же самое, поскольку Вы в течение многих лет
CAST(CONVERT(VARCHAR, [tstamp], 102) AS DATETIME) = @dateParam
Кажетесь мне как это, один из лучших способов снять изоляцию со времени с точки зрения гибкости, скорости и readabily. (извините). Некоторые функции UDF, как предложено могут быть полезными, но UDFs может быть медленным с большими наборами результатов.
CONVERT (date, GETDATE ())
и CONVERT (time, GETDATE ())
работает в SQL Server 2008. Я не уверен насчет 2005 года.
В качестве альтернативы вы можете использовать
declare @d datetimeselect
@d = '2008-12-1 14:30:12'
where tstamp
BETWEEN dateadd(dd, datediff(dd, 0, @d)+0, 0)
AND dateadd(dd, datediff(dd, 0, @d)+1, 0)