Дата SQL MS только без времени

По умолчанию findOneAndUpdate возвращает исходный документ. Если вы хотите, чтобы он возвратил измененный документ, передайте объект опций { new: true } в функцию:

Cat.findOneAndUpdate({ age: 17 }, { $set: { name: "Naomi" } }, { new: true }, function(err, doc) {

});

39
задан Cade Roux 24 January 2009 в 06:33
поделиться

11 ответов

это очень плохо для производительности, смотрите на Только В Базе данных, Может Вы Получать 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)
35
ответ дан SQLMenace 23 September 2019 в 17:11
поделиться
WHERE DATEDIFF(day, tstamp, @dateParam) = 0

Это должно получить Вас там, если Вы не заботитесь во время.

Это должно ответить на meta вопрос сравнения дат двух значений, когда Вы не заботитесь во время.

-1
ответ дан DarthJDG 23 September 2019 в 17:11
поделиться

Да, T-SQL может чувствовать себя чрезвычайно примитивным время от времени, и это - вещи как они, что часто времена продвигают меня к выполнению большой моей логики на моем предпочтительном языке (таком как C#).

Однако, когда абсолютно необходимо сделать некоторые из этих вещей в SQL по причинам производительности, тогда лучший выбор состоит в том, чтобы создать функции для корпуса этих "алгоритмов".

Смотрят на эту статью. Он предлагает довольно много удобных функций SQL вдоль этих строк, что я думаю, поможет Вам.

http://weblogs.sqlteam.com/jeffs/archive/2007/01/02/56079.aspx

1
ответ дан Lusid 23 September 2019 в 17:11
поделиться

Функции Даты, отправленные другими, являются самым корректным способом обработать это.

Однако это забавно, Вы упоминаете термин "пол", потому что существует немного взлома, который будет работать несколько быстрее:

CAST(FLOOR(CAST(@dateParam AS float)) AS DateTime)
9
ответ дан Joel Coehoorn 23 September 2019 в 17:11
поделиться
DATEADD(d, 0, DATEDIFF(d, 0, [tstamp]))

Редактирование: В то время как это удалит часть времени Вашей даты и времени, она также сделает условие не SARGable. Если это важно для этого запроса, индексное представление или между пунктом является более соответствующим.

1
ответ дан DarthJDG 23 September 2019 в 17:11
поделиться

При использовании SQL Server 2008, этому встроили это теперь, посмотрите это в книги онлайн

CAST(GETDATE() AS date)

81
ответ дан mattmc3 23 September 2019 в 17:11
поделиться

Осторожный здесь при использовании чего-нибудь длинное строки 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 столбец, и индекс будет использоваться, и Вы не должны слоняться без дела с преобразованиями.

1
ответ дан Sam Saffron 23 September 2019 в 17:11
поделиться

Вот запрос, который возвратит все результаты в диапазоне дней.

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))
0
ответ дан Rob Boek 23 September 2019 в 17:11
поделиться

FWIW, я делал то же самое, поскольку Вы в течение многих лет

CAST(CONVERT(VARCHAR, [tstamp], 102) AS DATETIME) = @dateParam 

Кажетесь мне как это, один из лучших способов снять изоляцию со времени с точки зрения гибкости, скорости и readabily. (извините). Некоторые функции UDF, как предложено могут быть полезными, но UDFs может быть медленным с большими наборами результатов.

0
ответ дан DarthJDG 23 September 2019 в 17:11
поделиться

CONVERT (date, GETDATE ()) и CONVERT (time, GETDATE ()) работает в SQL Server 2008. Я не уверен насчет 2005 года.

7
ответ дан 27 November 2019 в 01:04
поделиться

В качестве альтернативы вы можете использовать

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)
0
ответ дан 27 November 2019 в 01:04
поделиться