WedX - журнал о программировании и компьютерных науках

Необходимо найти дату между двумя датами в SQL Server 2008

Мне нужна помощь с запросом, чтобы найти все даты с 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'

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

Зачем ?

14.03.2010

  • Вам следует пояснить свой вопрос на примере проблемы. 14.03.2010

Ответы:


1

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

Вот решение:

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


Изменить:

После уточнения проблема, похоже, заключается в формате вводимой даты: дд / мм / гггг.

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
14.03.2010
  • Да, это то, что я думал, что OP тоже означает. 14.03.2010
  • спасибо за помощь, мне нужно что-то простое, выберите ... # 03/03 / 2010..между ... и мне нужен такой формат даты (дд / мм / гггг) 14.03.2010

  • 2

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

    14.03.2010

    3

    BOL всегда является хорошим ориентиром ...

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

    14.03.2010

    4

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

    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)
    
    11.01.2013
    Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]