#sql #sql-server #datetime
#sql #sql-сервер #datetime
Вопрос:
возможно, здесь очень глупый вопрос, но допустим:
declare @startdate datetime
declare @enddate datetime
set @startdate = '2013-05-01'
set @enddate = '2014-04-30'
select * from table
where table.timestamp between @startdate AND @enddate
Как я уже сказал, глупый вопрос, но будет ли это генерировать все записи с 1 мая 2013 00:00:00 до 30 апреля 2013 00:00:00? т.е. ровно один год? Или мне нужно будет изменить конечную дату на 23:59:59, чтобы включить 30-е число в качестве последнего дня?
спасибо и еще раз извиняюсь за то, что может показаться глупым вопросом.
Ответ №1:
Предполагая, что у вас включен индекс table.timestamp
, самым быстрым решением, вероятно, является увеличение даты окончания на один день и использование >=
и <
вместо BETWEEN
:
select * from table
where table.timestamp >= @startdate AND table.timestamp < DATEADD(day,1,@enddate)
Любые формулы, используемые в table.timestamp
(например truncate
, cast
, и т.д.), Будут сводить на нет использование индекса, если индекс не основан на том же выражении.
Комментарии:
1. Спасибо, это будет включать последний день года (30 апреля 14?). приветствия
2. Это будет включать данные до (но не включая)
2014-05-01 00:00:00.000
3. FWIW, простое приведение datetime к дате все еще возможно. Если вы присоединяетесь к большой таблице пар startdate / enddate, приведение может быть лучше, чем dateadd . sqlblog.com/blogs/paul_white/archive/2012/01/18 /…
Ответ №2:
Попробуйте выполнить следующее:-
select * from table
where cast(table.timestamp as date) between @startdate AND @enddate
Какими бы ни были данные table.timestamp
, данные будут отображаться.
Ответ №3:
Это легко проверить:
CREATE TABLE #temp (id INT IDENTITY(1,1), somedates DATETIME)
INSERT INTO #temp
( somedates )
VALUES ( '2014-06-13 14:20:34' )
SELECT *
FROM #temp
WHERE somedates BETWEEN '2014-06-01' AND '2014-06-13'
--No Results returned
SELECT *
FROM #temp
WHERE somedates BETWEEN '2014-06-01' AND DATEADD(ms,-1,'2014-06-14')
--One result returned
DROP TABLE #temp
Поэтому, если вы хотите включить записи 30 апреля, вам нужно увеличить конечную дату на 1.