Тип данных SQL server datetime (время по умолчанию)

#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.