Member 13021396 Ответов: 2

Как я могу вернуть даты в течение указанного периода ежегодно


Я создаю отчет SQL, который должен выполняться ежегодно с 31/03/ по 01/04 следующего года.

Как я могу закодировать это в SQL

Что я уже пробовал:

sales_date BETWEEN DateAdd(yy,-1,(DateAdd(dd, -1, '01/04/YYYY'))) AND '01/04/YYYY'

OriginalGriff

Это не очень хороший вопрос - мы не можем понять из этого малого, что вы пытаетесь сделать.
Помните, что мы не можем видеть ваш экран, получить доступ к вашему жесткому диску или прочитать ваши мысли.
Этот запрос не будет работать, потому что "гггг" - это не год, но если вы замените его "2016", то он, вероятно, должен делать то, что вы хотите.
Так почему же это для вас проблема? А если нет, то в чем проблема? Мы получаем только то, что вы набираете для работы, мы не получаем более широкого контекста вашего проекта, поэтому чем больше деталей вы нам дадите, тем лучше мы сможем дать ответ.
Используйте виджет" улучшить вопрос", чтобы отредактировать свой вопрос и предоставить более подробную информацию.

Richard Deeming

Если бы вы запустили отчет сегодня, хотели бы вы, чтобы он работал с 2017/03/31 по 2018/04/01? Или с 2016/03/31 по 2017/04/01?

Если это отчет "текущего финансового года", то я ожидаю последнего.

2 Ответов

Рейтинг:
2

Peter Leow

Если я вас правильно понял, вы пытаетесь получить записи в период с 31 марта текущего года по 1 апреля следующего года, то
1. Создайте datetime для currentyear-3-31 следующим образом:

SELECT CAST(CAST(DATEPART(year, getdate()) AS VARCHAR) + '-3-31' AS DATETIME)
; и
2. Создайте datetime для nextyear-4-1 следующим образом:
SELECT CAST(CAST(DATEPART(year, getdate())+1 AS VARCHAR) + '-4-1' AS DATETIME)
См. демо-версию: Создание конкретной даты в TSQL, Sql Server[^]


Maciej Los

Извините, Питер, но преобразование данных varchar в дату является распространенной причиной ошибок. Пожалуйста, посмотрите мое решение.

Рейтинг:
1

Maciej Los

В противоположность Леоу Питера[^] решение, я бы предложил использовать:
- для MS SQL Server 2012 и выше: DATEFROMPARTS (Transact-SQL)[^] функция
- для более ранних версий-комбинация DATEADD (Transact-SQL)[^], функция GETDATE()[^], функция DateDiff()[^], прием.

Например:
сегодня:

SELECT DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)

вчера:
DATEADD(day, DATEDIFF(day, 0, GETDATE()), -1)

начало месяца:
DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)

конец прошлого месяца:
DATEADD(month, DATEDIFF(month, 0, GETDATE()), -1)

начало следующего месяца:
DATEADD(month, DATEDIFF(month, 0, GETDATE()), 31)


Измените его в соответствии с вашими потребностями. Попробуй!

[РЕДАКТИРОВАТЬ]
Совет:
DECLARE @months INT = 12+(4-MONTH(GETDATE())-12)
SELECT DATEADD(month, DATEDIFF(month, 0, DATEADD(month, @months, GETDATE())), -1) AS FiscalYearStart, 
	DATEADD(month, DATEDIFF(month, 0, DATEADD(month, @months+12, GETDATE())), 0) AS FiscalYearEnd

возвращается:
FiscalYearStart			FiscalYearEnd
2017-03-31 00:00:00.000	2018-04-01 00:00:00.000