2015-03-19 145 views
0

如何才能在MySQL中編寫語句以返回上一季度的上一個開始和結束日期?假設我想在這一季之前的季度的開始和結束日期(即去年十月開始和去年十二月底)。在MySQL中返回上一季度的開始和結束日期

+0

任何你至今嘗試過? – CurseStacker 2015-03-19 02:48:04

+0

我到目前爲止:'date_add(current_date(),INTERVAL'-1'QUARTER)',但它沒有做我想做的事,因爲它只是從當前日期中移除4個月。 – Blobert 2015-03-19 02:51:31

回答

4

試試這個:

SELECT 
    MAKEDATE(YEAR(CURDATE()), 1) + INTERVAL QUARTER(CURDATE())-1 QUARTER - INTERVAL 1 DAY, 
    MAKEDATE(YEAR(CURDATE()), 1) + INTERVAL QUARTER(CURDATE())-2 QUARTER 
+0

謝謝,這個工程。 – Blobert 2015-03-19 03:11:05

+0

@Blobert,沒問題,很高興我能幫到你。 – 2015-03-19 03:12:57

0

開始和季度末是固定的,所以沒有必要實際上是「計算」的 - 我們知道他們是1月1日,4月1日,等, 3月31日,6月30日等。

所以我們留下的所有東西都是在固定的日期之前得到正確的年份 - 如果當前季度是Q1,則返回一年,否則使用當前年份。

QUARTER(NOW())會給我們當前季度(1〜4),所以這可能是如此簡單:

SELECT 
    CASE QUARTER(NOW()) 
    WHEN 1 THEN DATE_FORMAT(NOW() - INTERVAL 1 YEAR, '%Y-10-01') 
    WHEN 2 THEN DATE_FORMAT(NOW(), '%Y-01-01') 
    WHEN 3 THEN DATE_FORMAT(NOW(), '%Y-04-01') 
    WHEN 4 THEN DATE_FORMAT(NOW(), '%Y-07-01') 
    END AS previous_quarter_begin, 
    CASE QUARTER(NOW()) 
    WHEN 1 THEN DATE_FORMAT(NOW() - INTERVAL 1 YEAR, '%Y-12-31') 
    WHEN 2 THEN DATE_FORMAT(NOW(), '%Y-03-31') 
    WHEN 3 THEN DATE_FORMAT(NOW(), '%Y-06-30') 
    WHEN 4 THEN DATE_FORMAT(NOW(), '%Y-09-30') 
    END AS previous_quarter_end 

http://sqlfiddle.com/#!9/9eecb/1858

如果你想在一個不同的格式的日期,說mm/dd/yyyy,那麼你可以簡單地改變指定的格式爲10/01/%Y

(如果你想測試這個,看看它是否實際上正常工作的不同日期,那麼你可以替換每個在一個固定的日期上述查詢的NOW()發生,好比說'2015-12-22',看看這會給在12月的日期預期的結果。)

+0

感謝您的回答。稍微複雜一點,但我會仔細看看。我相信它將在未來有用。 – Blobert 2015-03-19 03:11:58

0

我發現它有助於使用該TRUNC_QUARTER存儲功能。它會在日曆季度的第一天將任何日期或日期/時間值轉換爲午夜。然後你可以使用INTERVAL算術來操縱它。

DELIMITER $$ 
DROP FUNCTION IF EXISTS TRUNC_QUARTER$$ 
CREATE 
    FUNCTION TRUNC_QUARTER(datestamp DATETIME) 
    RETURNS DATE DETERMINISTIC NO SQL 
    COMMENT 'returns preceding first of the quarter' 
    RETURN DATE(CONCAT(YEAR(datestamp),'-', 1 + 3*(QUARTER(datestamp)-1),'-01'))$$ 
DELIMITER ; 

有了它,你可以這樣寫:

SELECT TRUNC_QUARTER(CURDATE()) - INTERVAL 1 QUARTER start_last_quarter, 
     TRUNC_QUARTER(CURDATE()) - INTERVAL 1 DAY end_last_quarter 
相關問題