Создание динамического диапазона дат в SQL

Как я могу создать оператор SQL, который всегда будет возвращать дату начала 1 июля прошлого года и дату окончания 30 июня текущего года на основе GETDATE ()? Прямо сейчас у меня есть

    Dateadd(yy, Datediff(yy,1,GETDATE())-1,0) AS StartDate,
DateAdd(dd,-1,Dateadd(yy, Datediff(yy,0,GETDATE()),0)) AS EndDate

который вернется 1 января 2012 г. и 31 декабря 2013 г. соответственно.


person FrozenYeti    schedule 01.07.2013    source источник


Ответы (4)


Вы можете просто добавить еще один DATEADD () к вашему текущему скрипту:

SELECT DATEADD(month,6,DATEADD(yy, DATEDIFF(yy,1,GETDATE())-1,0)) AS StartDate
      ,DATEADD(month,6,DATEADD(dd,-1,DATEADD(yy, DATEDIFF(yy,0,GETDATE()),0))) AS EndDate
person Hart CO    schedule 01.07.2013
comment
Спасибо. Я попытался использовать другую функцию DATEADD, но не мог точно понять, как ее использовать. Это прекрасно работает. - person FrozenYeti; 01.07.2013

Это похоже на странную просьбу. Один из способов сделать это - построить строки даты и проанализировать их:

select cast(cast(year(GETDATE()) - 1 as varchar(255))+'-07-01' as DATE) as StartDate,
       cast(cast(year(GETDATE()) as varchar(255))+'-06-30' as DATE) as EndDate

Это создает строки в формате '2013-06-30', который будет правильно интерпретироваться для большинства настроек даты SQL Server.

Я считаю (вспоминая то, что написал Аарон Бертран), что пропуск дефисов всегда работает:

select cast(cast(year(GETDATE()) - 1 as varchar(255))+'0701' as DATE) as StartDate,
       cast(cast(year(GETDATE()) as varchar(255))+'0630' as DATE) as EndDate

Я, как человек, предпочитаю использовать дефисы.

person Gordon Linoff    schedule 01.07.2013

Я использовал этот CTE для динамических диапазонов финансового года на основе текущей даты. Он возвращает даты начала и окончания текущего финансового года на основе текущей даты.

WITH FYDates AS (
 SELECT 
    CASE 
        WHEN MONTH(GETDATE()) IN (1, 2, 3, 4, 5, 6) 
        THEN CAST(CAST(YEAR(GETDATE()) - 1 AS VARCHAR) + '/07/01' AS DATE)
        ELSE CAST(CAST(YEAR(GETDATE()) AS VARCHAR) + '/07/01' AS DATE) END AS FYStartDate, 
    CASE
        WHEN MONTH(GETDATE()) IN (1, 2, 3, 4, 5, 6)
        THEN CAST(CAST(YEAR(GETDATE()) AS VARCHAR) + '/06/30' AS DATE) 
        ELSE CAST(CAST(YEAR(GETDATE()) + 1 AS VARCHAR) + '/06/30' AS DATE) END AS FYEndDate
),

Вы также можете создать это как представление, чтобы ссылаться на него, когда это необходимо.

person bretsbk    schedule 02.02.2016

Это должно сработать для вас:

SELECT CAST('7/1/' + CAST(DATEPART(yy, Dateadd(yy, Datediff(yy,1,GETDATE())-1,0)) as varchar) as varchar) as startdate,
CAST('6/30/' + CAST(DATEPART(yy, Dateadd(yy, Datediff(yy,0,GETDATE()),0)) as varchar) as varchar) as enddate
person logixologist    schedule 01.07.2013