Нужно найти дату между 2 датами в SQL Server 2008 - PullRequest
1 голос
/ 14 марта 2010

Мне нужна помощь с запросом, чтобы найти все даты, которые находятся между 31.12.2009 и 31.02.2010

В SQL Server 2008

я пробую это:

SELECT  convert(varchar(50), MyDate, 103)
where convert(varchar(50), MyDate, 103) >= '31/12/2009' and convert(varchar(50), MyDate, 103) <='31/02/2010'

но это дает мне неверный результат

почему?

Ответы [ 4 ]

3 голосов
/ 14 марта 2010

У меня была другая интерпретация вопроса: «Как сгенерировать все даты в определенном диапазоне?»

Вот решение этого вопроса:

--define start and end limits
Declare @todate datetime, @fromdate datetime
Select @fromdate='2009-03-01', @todate='2009-04-10' 

;With DateSequence( Date ) as
(
    Select @fromdate as Date
        union all
    Select dateadd(day, 1, Date)
        from DateSequence
        where Date < @todate
)

--select result
Select * from DateSequence option (MaxRecursion 1000)

Есть хорошая статья , которая показывает, как генерировать последовательности (числа, даты, время), используя CTE.


Edit:

После прояснения проблема выглядит как формат вводимой даты: дд / мм / гггг.

SQL Server ожидает формат мм / дд / гггг.

Я бы просто преобразовал его перед выполнением оператора select:

-- Assuming two variables, @inputFromDate and @inputToDate, in the format of dd/mm/yyyy...

declare @fromDate varchar(10), @toDate varchar(10)
set @fromDate = 
substring(@inputFromDate, 3, 2) + '/' + 
substring(@inputFromDate, 1, 2) + '/' + 
substring(@inputFromDate, 7, 4)

set @toDate = 
substring(@inputToDate, 3, 2) + '/' + 
substring(@inputToDate, 1, 2) + '/' + 
substring(@inputToDate, 7, 4)

select * from SomeTable where dateCol >= @fromDate and dateCol < @toDate
-- you can change the < or >= comparisons according to your needs
1 голос
/ 14 марта 2010

Если столбец MyDate равен datetime, как кажется, значит, он уже находится в правильном «формате». Не конвертируйте его в varchar(50) в условии предиката - это сделает ваш запрос несортируемым и снизит производительность для любых индексов, которые у вас могут быть.

Вместо этого примите ваши параметры как date или datetime экземпляров:

SELECT ...
FROM MyTable
WHERE MyDate >= @BeginDate
AND MyDate <= @EndDate

Ваш запрос не должен зависеть от определенного формата даты во входных параметрах - эти параметры не являются типами varchar, они datetime (или date). Когда вы запускаете этот запрос или хранимую процедуру из любой среды, в которой находится приложение, и задаете параметры привязки (вы используете параметры связывания, верно?), Указанная библиотека автоматически решит любые проблемы с форматированием.

Если вы попытаетесь использовать операторы >= и <= для символьных представлений дат в любом формате, отличном от стандарта ISO yyyymmdd, вы получите неправильные результаты, поскольку алфавитный порядок отличается от временный порядок. Не делай этого.

Если вам просто нужно написать специальный запрос, т. Е. Он не выполняется из какой-либо среды программирования, тогда просто не используйте формат dd/mm/yyyy. Вместо этого используйте формат даты ISO; оно однозначно и неявно преобразуется в datetime значения:

SELECT ...
FROM MyTable
WHERE MyDate >= '20091231'
AND MyDate <= '20100231'

Честно говоря, никакое другое решение не является приемлемым в моей голове. Для специальных запросов всегда используйте однозначный стандарт ISO для дат. Для приложений, подключающихся к базе данных, всегда используйте параметры связывания. Если вы делаете что-то еще, вы пишете код, который либо ненадежен, либо ненадежен, либо и то, и другое.

0 голосов
/ 11 января 2013

Вы пробовали это:

DECLARE @FROMDATE DATETIME 
DECLARE @TODATE DATETIME 
SET @FROMDATE = GETDATE()
SET @TODATE = GETDATE()+7 
;WITH DATEINFO(DATES) AS (SELECT @FROMDATE UNION ALL SELECT DATES + 1 FROM DATEINFO WHERE DATES < @TODATE) 
SELECT * FROM DATEINFO OPTION (MAXRECURSION 0)
0 голосов
/ 14 марта 2010

BOL всегда хороший справочник ...

Начните с МЕЖДУ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...