【问题标题】:Changing Jan to Dec YTD date functions to run April to March将 Jan 到 Dec YTD 日期函数更改为从 4 月到 3 月运行
【发布时间】:2015-06-19 18:52:59
【问题描述】:

我有 7 个略有不同的日期函数,它们根据创建日期和到达日期计算 YTD 预订 [1 月至 12 月] [请参见下文]。我的问题是,如何轻松更改这些以适应 4 月至 3 月的财政年度,而不是 1 月至 12 月?

1.   --CREATED BY YEAR--LAST YEAR - UP TO TODAY'S DATE (BASED ON *CREATED DATE*)---
COUNT(CASE WHEN (CAST(MASTER_VIEW_TradingReports.CreatedDate AS DATE)>=CAST(DATEPART(yyyy,DATEADD(m,-12,GETDATE())) AS VARCHAR)+'-01-01') AND (CAST(MASTER_VIEW_TradingReports.CreatedDate AS DATE)<DATEADD(m,-12,GETDATE())) THEN MASTER_VIEW_TradingReports.HolidayCost END) AS [LastYearToDateBookingsCreated]

2. --CREATED BY YEAR--THIS YEAR - UP TO TODAY'S DATE (BASED ON *CREATED DATE*)---
COUNT(CASE WHEN MASTER_VIEW_TradingReports.CreatedYear=DATEPART(yyyy,GETDATE()) THEN MASTER_VIEW_TradingReports.HolidayCost END) AS [ThisYearToDateBookingsCreated]

3. --ARRIVALS BY YEAR--LAST YEAR - UP TO TODAY'S DATE (BASED ON *ARRIVAL DATE*, NOT CREATED DATE)---
ISNULL(COUNT(CASE WHEN (DATEPART(yyyy, MASTER_VIEW_TradingReports.ArrivalDate) = DATEPART(yyyy, DATEADD(m, - 12, GETDATE())) AND CAST(MASTER_VIEW_TradingReports.CreatedDate AS DATE) <= DATEADD(m, - 12, GETDATE())) THEN MASTER_VIEW_TradingReports.HolidayCost END), 0) AS [LastYearToDateBookings]

4. --ARRIVALS BY YEAR--THIS YEAR - UP TO TODAY'S DATE (arrivals this year onward, with any createdate up to today)---
ISNULL(COUNT(CASE WHEN (DATEPART(yyyy, MASTER_VIEW_TradingReports.ArrivalDate) = DATEPART(yyyy, GETDATE()) AND CAST(MASTER_VIEW_TradingReports.CreatedDate AS DATE) <= GETDATE()) THEN MASTER_VIEW_TradingReports.HolidayCost END), 0) AS [YearToDateBookings]

5. --ARRIVALS BY YEAR--NEXT YEAR - UP TO TODAY'S DATE (arrivals next year, with any createdate up to today)---
ISNULL(COUNT(CASE WHEN (DATEPART(yyyy, MASTER_VIEW_TradingReports.ArrivalDate) = DATEPART(yyyy, GETDATE()) + 1 AND CAST(MASTER_VIEW_TradingReports.CreatedDate AS DATE) <= GETDATE()) THEN MASTER_VIEW_TradingReports.HolidayCost END), 0) AS [NextYearToDateBookings]

6. --ARRIVALS ANYTIME THIS YEAR THAT WERE CREATED UP TO TODAY'S DATE LAST YEAR--
ISNULL(COUNT(CASE WHEN (DATEPART(yyyy, MASTER_VIEW_TradingReports.ArrivalDate) = DATEPART(yyyy, GETDATE()) AND (DATEPART(yyyy, MASTER_VIEW_TradingReports.CreatedDate) = DATEPART(yyyy, GETDATE())-1 AND CAST(MASTER_VIEW_TradingReports.CreatedDate AS DATE)<=CAST(DATEADD(d,-364,GETDATE()) AS DATE))) THEN MASTER_VIEW_TradingReports.HolidayCost END), 0) AS ThisYearToDateBookingsByArrivalsBookedLastYear

7. --ARRIVALS ANYTIME NEXT YEAR THAT WERE CREATED UP TO TODAY'S DATE THIS YEAR---
ISNULL(COUNT(CASE WHEN (DATEPART(yyyy, MASTER_VIEW_TradingReports.ArrivalDate) = DATEPART(yyyy, GETDATE())+1 AND (DATEPART(yyyy, MASTER_VIEW_TradingReports.CreatedDate) = DATEPART(yyyy, GETDATE()))) THEN MASTER_VIEW_TradingReports.HolidayCost END), 0) AS NextYearToDateBookingsByArrivalsBookedThisYear

【问题讨论】:

    标签: sql sql-date-functions


    【解决方案1】:

    我认为这样的东西应该适合你。

     BEGIN
    DECLARE @LASTENDDATE DATE
    DECLARE @LASTSTARTDATE DATE
    DECLARE @THISENDDATE DATE
    DECLARE @THISSTARTDATE DATE
    DECLARE @NEXTENDDATE DATE
    DECLARE @NEXTSTARTDATE DATE
    
    -- Last Financial Year
    SELECT @LASTENDDATE = DATEADD(dd,-365,(DATEPART(year, GETDATE())||'0331'))
    SELECT @LASTSTARTDATE = DATEADD(dd,-364,@LASTENDDATE)
    
    -- This Financial Year
    SELECT @THISENDDATE = DATEPART(year, GETDATE())||'0331'
    SELECT @THISSTARTDATE = DATEADD(dd,-364,@THISENDDATE)
    
    -- Next Financial Year
    SELECT @NEXTENDDATE =  DATEADD(dd,+366,(DATEPART(year, GETDATE())||'0331'))
    SELECT @NEXTSTARTDATE = DATEADD(dd,-365,@NEXTENDDATE)
    
    1.   --CREATED BY YEAR--LAST YEAR - UP TO TODAY'S DATE (BASED ON *CREATED DATE*)---
    COUNT(CASE WHEN CAST(MASTER_VIEW_TradingReports.CreatedDate AS DATE) BETWEEN @THISSTARTDATE AND @THISENDDATE  THEN MASTER_VIEW_TradingReports.HolidayCost END) AS [LastYearToDateBookingsCreated]
    
    2. --CREATED BY YEAR--THIS YEAR - UP TO TODAY'S DATE (BASED ON *CREATED DATE*)---
    COUNT(CASE WHEN MASTER_VIEW_TradingReports.CreatedDate BETWEEN @THISSTARTDATE AND GETDATE() THEN MASTER_VIEW_TradingReports.HolidayCost END) AS [ThisYearToDateBookingsCreated]
    
    3. --ARRIVALS BY YEAR--LAST YEAR - UP TO TODAY'S DATE (BASED ON *ARRIVAL DATE*, NOT CREATED DATE)---
    ISNULL(COUNT(CASE WHEN MASTER_VIEW_TradingReports.ArrivalDate BETWEEN @LASTSTARTDATE AND @LASTENDDATE AND CAST(MASTER_VIEW_TradingReports.CreatedDate AS DATE) <= DATEADD(m, - 12, GETDATE()) THEN MASTER_VIEW_TradingReports.HolidayCost END), 0) AS [LastYearToDateBookings]
    
    4. --ARRIVALS BY YEAR--THIS YEAR - UP TO TODAY'S DATE (arrivals this year onward, with any createdate up to today)---
    ISNULL(COUNT(CASE WHEN MASTER_VIEW_TradingReports.ArrivalDate BETWEEN @THISSTARTDATE AND @THISENDDATE AND CAST(MASTER_VIEW_TradingReports.CreatedDate AS DATE) <= GETDATE() THEN MASTER_VIEW_TradingReports.HolidayCost END), 0) AS [YearToDateBookings]
    
    5. --ARRIVALS BY YEAR--NEXT YEAR - UP TO TODAY'S DATE (arrivals next year, with any createdate up to today)---
    ISNULL(COUNT(CASE WHEN MASTER_VIEW_TradingReports.ArrivalDate BETWEEN @NEXTSTARTDATE AND @NEXTENDDATE AND CAST(MASTER_VIEW_TradingReports.CreatedDate AS DATE) <= GETDATE() THEN MASTER_VIEW_TradingReports.HolidayCost END), 0) AS [NextYearToDateBookings]
    
    6. --ARRIVALS ANYTIME THIS YEAR THAT WERE CREATED UP TO TODAY'S DATE LAST YEAR--
    ISNULL(COUNT(CASE WHEN MASTER_VIEW_TradingReports.ArrivalDate BETWEEN @THISSTARTDATE AND @THISENDDATE AND MASTER_VIEW_TradingReports.CreatedDate BETWEEN @LASTSTARTDATE AND DATEADD(dd,-365,GETDATE()) THEN MASTER_VIEW_TradingReports.HolidayCost END), 0) AS ThisYearToDateBookingsByArrivalsBookedLastYear
    
    7. --ARRIVALS ANYTIME NEXT YEAR THAT WERE CREATED UP TO TODAY'S DATE THIS YEAR---
    ISNULL(COUNT(CASE WHEN MASTER_VIEW_TradingReports.ArrivalDate BETWEEN @NEXTSTARTDATE AND @NEXTENDDATE AND MASTER_VIEW_TradingReports.CreatedDate BETWEEN @THISSTARTDATE AND GETDATE() THEN MASTER_VIEW_TradingReports.HolidayCost END), 0) AS NextYearToDateBookingsByArrivalsBookedThisYear
    
    END
    

    【讨论】:

    • 嗨,凯文,感谢您回复我。我尝试运行上述并得到以下错误。设法通过删除一个“|”来修复前 3 个,但它似乎在第一个 COUNT 上抛出了一个错误。任何想法可能是什么原因造成的?消息 102,级别 15,状态 1,第 9 行 '|' 附近的语法不正确。消息 102,级别 15,状态 1,第 11 行 '|' 附近的语法不正确。消息 102,级别 15,状态 1,第 13 行 '|' 附近的语法不正确。消息 102,级别 15,状态 1,第 17 行 'COUNT' 附近的语法不正确。
    • 现在再试一次,我在查询中有几个括号太多了。抱歉,我面前没有数据库来测试语法。
    • 我遇到以下错误:- Msg 206, Level 16, State 2, Line 14 操作数类型冲突:int 与日期不兼容我猜它与 GETDATE() 有关)||'0331')) ?
    • 尝试替换连接双管道 ||带加号 +。例如像这样... DATEADD(dd,-365,(DATEPART(year, GETDATE()+'0331'))
    • 最终想通了:) 应该是... DATEPART(YEAR,GETDATE())-1)+'-03-31')) DATEPART(YEAR,GETDATE()))+' -03-31')) DATEPART(YEAR,GETDATE())+1)+'-03-31')) 感谢您的帮助。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    相关资源
    最近更新 更多