2016-05-11 2 views
0

У меня есть таблица, которая включает в себя колонки Season и Academic_Year. Academic_Year - тип int. Сезон может быть весной, летом или осенью.манипуляция MS SQL DATE с сезоном года

  • Fall 2016 от 1 сентября 2016 года до 31 декабря 2016 года
  • Spring 2016 от 1 января 2017 года по 31 марта 2017 (не опечатка - учебный год 2016 от сентября 2016 года по август 2017 года)
  • лето 2016 от 1 апреля 2017 года до 31 августа 2017

мне нужно выбрать строки, когда GETDATE() находится между числом дней до и после начала сезона, в псевдокоде

WHERE 
    (getdate() > 31/3/16 AND getdate() < 31/9/16 AND Season = 'Autumn' AND Academic_Year = 2016) 
    OR (getdate() > 31/9/16 AND getdate() < 31/1/17 AND Season = 'Spring' AND Academic_Year = 2016) 
    OR (getdate() > 31/12/16 AND getdate() < 31/4/17 AND Season = 'Summer' AND Academic_Year = 2016) 

Моя проблема заключается в создании даты для сравнения с getdate(). Мне нужно объединить строку - '31/3/'- с int - Academic_Year и создать дату.

Решение не должно быть эффективным, но ему необходимо работать с версиями сервера SQL Server 2008 и более поздних версий.

+0

Я не вижу, что ваш псевдо-код имеет отношение к вашему пункту «Моя проблема ...». Можете ли вы привести пример существующих данных и желаемых результатов из этих данных? –

+0

не поможет вам понять, что вы собираетесь делать, когда «Academic_Year» - 2016, но вы в сезоне, который растягивается до 2017 года. – JamieD77

+0

Разверните таблицу, чтобы иметь поле «Season_Start_Date» и «Season_End_Date» , – AHiggins

ответ

0

SQL позволит это преобразование, если вы просто соедините varchar и скажите ему, чтобы он преобразовывался в date. Например:

declare @year int = 2016 
declare @date varchar(10) = '3/31' 

select cast(@date + '/' + cast(@year as varchar(4)) as date) 

Вы должны забрасывать integer год varchar объединить его с другими varchar, но тогда вы можете бросить все вещи к date (или datetime), как только вы признанную формат даты.

+0

В качестве побочного элемента вы можете изучить функции 'dateadd' и' lateiff' - они могут быть проще, чем вручную вводить даты, которые вы хотите использовать для своих проверок. – APH

0

Вы можете создать свою дату, используя конкатенацию строки и года.

CONVERT(VARCHAR(4), Academic_Year) + '-03-31' 

Как только у вас есть строка даты, вы можете использовать функции даты, чтобы манипулировать им дальше, если это необходимо.

+0

- спасибо за это - я экспериментировал с такой конструкцией, но пытался «31 -03-» + CONVERT (VARCHAR (4), Academic_Year), который не работал. Имейте + 1'д но еще недостаточно репутации для этого, чтобы показать :-( – Nick

0
WHERE (GETDATE() > CONVERT(VARCHAR(4),Academic_Year) + '-03-31' 
    AND GETDATE() < CONVERT(VARCHAR(4),Academic_Year) + '-09-30' 
    AND Season = 'Autumn') etc 

работал для меня. Трюк добавлял «-03-31», а не «31 -03-». Спасибо @kicken

Смежные вопросы