簡體   English   中英

基於SQL中日期范圍的動態創建設置日期的方法

[英]Dynamic way to create a set date based on a range of dates in SQL

我正在嘗試根據范圍創建一個設置日期,以便為可視化創建一個設置。 這是非常重復的,不是未來的證明。 有沒有人對如何簡化這個有任何想法?

Select CASE WHEN date BETWEEN '2010-08-01 00:00:00' AND '2011-07-31 12:59:59'
        THEN '2011-05-31 00:00:00'
    WHEN date BETWEEN '2011-08-01 00:00:00' AND '2012-07-31 12:59:59'
        THEN '2012-05-31 00:00:00'
    WHEN date BETWEEN '2012-08-01 00:00:00' AND '2013-07-31 12:59:59'
        THEN '2013-05-31 00:00:00'
    WHEN date BETWEEN '2013-08-01 00:00:00' AND '2014-07-31 12:59:59'
        THEN '2014-05-31 00:00:00'
    WHEN date BETWEEN '2014-08-01 00:00:00' AND '2015-07-31 12:59:59'
        THEN '2015-05-31 00:00:00'
    WHEN date BETWEEN '2015-08-01 00:00:00' AND '2016-07-31 12:59:59'
        THEN '2016-05-31 00:00:00'
    WHEN date BETWEEN '2016-08-01 00:00:00' AND '2017-07-31 12:59:59'
        THEN '2017-05-31 00:00:00'
    WHEN date BETWEEN '2017-08-01 00:00:00' AND '2018-07-31 12:59:59'
        THEN '2018-05-31 00:00:00'
    WHEN date BETWEEN '2018-08-01 00:00:00' AND '2019-07-31 12:59:59'
        THEN '2019-05-31 00:00:00'
    WHEN date BETWEEN '2019-08-01 00:00:00' AND '2020-07-31 12:59:59'
        THEN '2020-05-31 00:00:00'
    END AS modifiedDate, 

從表1

您可能希望基於某種奇怪的日期算法(可能是某種會計年度)來確定5月31日。

所有這些都可以使用日期算術來計算。 沒有數據庫標簽,很難指定正確的語法。 但是,這個想法是:

select (date '2011-05-31' +
        (extract(year from date + interval '5 month') - 2011) * interval '1 year'
       )

這用ISO / ANSI SQL表示,但是這個想法可以在任何數據庫中表示-盡管任何給定的數據庫也可能具有其他方法。

在SQL Server中,這將是:

select dateadd(year,
               (extract(year from date + interval '5 month') - 2011),
               '2011-05-31'
              )

在您回答之前,已從另一個站點獲得了此功能,效果很好:

Case when month(date)>=8 then datefromparts(year(date)+1,5,31) 
        when month(date)<8 then datefromparts(year(date),5,31) 
    end as modifiedDate

也感謝您的回答。 幫助我解決了其他一些問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM