2010-06-09 165 views

回答

36

用途:

SELECT 

DATE_SUB(
    LAST_DAY(
     DATE_ADD(NOW(), INTERVAL 1 MONTH) 
    ), 
    INTERVAL DAY(
     LAST_DAY(
      DATE_ADD(NOW(), INTERVAL 1 MONTH) 
     ) 
    )-1 DAY 
) AS firstOfNextMonth, 

LAST_DAY(
    DATE_ADD(NOW(), INTERVAL 1 MONTH) 
)AS lastOfNextMonth 
+0

+1節省許多小時 – dakshbhatt21 2013-07-12 12:46:20

+0

欲瞭解更多MySQL時間相關的功能,請參閱[本博文](http://sys-exit.blogspot.com/2013/06/mysql-today-tomorrow-yesterday- this.html) – ducin 2014-03-14 21:27:58

+0

@OMGPonies,使用'curdate'而不是'now()',因爲我們不需要計時。此外,對於第一天,它更簡單[簡單地減去當前月份的天數](http://stackoverflow.com/a/28844641/632951)。它也更快,因爲我們只做一個'date_sub()'調用和一個'day()'調用。 – Pacerier 2015-03-04 00:32:09

3
# FIRST date of next month 
select date_sub(date_add(curdate(), interval 1 month), interval day(curdate())-1 day); 

# LAST date of next month 
select date_sub(date_add(curdate(), interval 2 month), interval day(curdate()) day); 

不知道這是最短的查詢,但他們做的工作

+0

這個解決方案與Ponies的解決方案相比性能如何? – Pacerier 2015-03-03 23:27:05

27

下個月的最後一天,你可以使用LAST_DAY()功能:

SELECT LAST_DAY(DATE_ADD(CURDATE(), INTERVAL 1 MONTH)); 
+-------------------------------------------------+ 
| LAST_DAY(DATE_ADD(CURDATE(), INTERVAL 1 MONTH)) | 
+-------------------------------------------------+ 
| 2010-07-31          | 
+-------------------------------------------------+ 
1 row in set (0.00 sec) 

了一些測試的邊緣情況:

SELECT LAST_DAY(DATE_ADD('2010-01-31', INTERVAL 1 MONTH)); 
+----------------------------------------------------+ 
| LAST_DAY(DATE_ADD('2010-01-31', INTERVAL 1 MONTH)) | 
+----------------------------------------------------+ 
| 2010-02-28           | 
+----------------------------------------------------+ 
1 row in set (0.00 sec) 

SELECT LAST_DAY(DATE_ADD('2010-02-28', INTERVAL 1 MONTH)); 
+----------------------------------------------------+ 
| LAST_DAY(DATE_ADD('2010-02-28', INTERVAL 1 MONTH)) | 
+----------------------------------------------------+ 
| 2010-03-31           | 
+----------------------------------------------------+ 
1 row in set (0.00 sec) 

SELECT LAST_DAY(DATE_ADD('2010-08-31', INTERVAL 1 MONTH)); 
+----------------------------------------------------+ 
| LAST_DAY(DATE_ADD('2010-08-31', INTERVAL 1 MONTH)) | 
+----------------------------------------------------+ 
| 2010-09-30           | 
+----------------------------------------------------+ 
1 row in set (0.00 sec) 

還有一個使用DATE_FORMAT()函數的技巧t o獲得一個月的第一天。您可以按如下方式使用它:

SELECT DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 1 MONTH), '%Y-%m-01'); 
+---------------------------------------------------------------+ 
| DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 1 MONTH),'%Y-%m-01') | 
+---------------------------------------------------------------+ 
| 2010-07-01             | 
+---------------------------------------------------------------+ 
1 row in set (0.00 sec) 

因此:

SELECT DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 1 MONTH), '%Y-%m-01') AS 
      FirstDayOfNextMonth, 
     LAST_DAY(DATE_ADD(CURDATE(), INTERVAL 1 MONTH)) AS 
      LastDayOfNextMonth; 

+---------------------+--------------------+ 
| FirstDayOfNextMonth | LastDayOfNextMonth | 
+---------------------+--------------------+ 
| 2010-07-01   | 2010-07-31   | 
+---------------------+--------------------+ 
1 row in set (0.00 sec) 
+0

@Daneil,DATE_FORMAT會爲您返回一個'var_string',而不是一個日期。改用我的解決方案。 – Pacerier 2015-03-10 15:07:42

0

在PostgreSQL你有完美的約會截斷功能。

對於MySQL,我找到了一個討論here,這可能會給出一些想法。

+0

實際上是一個很好的鏈接,但是你想在它的內容中包含它的內容。無論如何,日期截斷函數是什麼意思? – Pacerier 2015-03-10 15:10:52

0
select Convert(varchar(10),DateAdd(Day, 1, getdate() - Day(getdate()) + 1) -1,105) 

select Convert(varchar(10),getdate(),105) 

select year(getdate()) 
+1

我認爲你的答案是SQL Server;)。 – 2015-05-14 08:19:36

0

以下是所有可能的解決方案。希望這將幫助......只要運行它來獲取所有的細節

SELECT 

    DATE_SUB(DATE_FORMAT(NOW(),'%Y-%m-%d'),INTERVAL 1 DAY) AS GetLastDay, 
    DATE_FORMAT(NOW(),'%Y-%m-%d') AS GetTodaysDate, 
    DATE_ADD(DATE_FORMAT(NOW(),'%Y-%m-%d'),INTERVAL 7 DAY) AS Add7DaysFromTodaysDate, 
    DATE_SUB(DATE_FORMAT(NOW(),'%Y-%m-%d'),INTERVAL 7 DAY) AS Substract7DaysFromTodaysDate, 
    DATE_ADD(DATE_FORMAT(NOW(),'%Y-%m-%d'),INTERVAL 1 MONTH) AS Add1MonthFromTodaysDate, 
    DATE_FORMAT(NOW(),'%Y-%m-01') AS FirstDayCurrentMonth , 
    LAST_DAY(DATE_FORMAT(NOW(),'%Y-%m-%d')) AS lastDayCurrentMonth, 
    DATE_SUB(LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH)), 
      INTERVAL DAY(LAST_DAY(DATE_ADD(NOW(), INTERVAL 1 MONTH)))-1 DAY) AS FirstOfNextMont007, 
    LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH)) AS lastOfpREMonth, 
    DATE_SUB(LAST_DAY(DATE_ADD(NOW(), INTERVAL 1 MONTH)), 
      INTERVAL DAY(LAST_DAY(DATE_ADD(NOW(), INTERVAL 1 MONTH)))-1 DAY) AS FirstOfNextMonth, 
    LAST_DAY(DATE_ADD(NOW(), INTERVAL 1 MONTH)) AS lastOfNextMonth 
2

由於@DanielVassallo解釋它,檢索下個月的最後一天是容易的:

SELECT LAST_DAY(DATE_ADD(CURRENT_DATE(), INTERVAL 1 MONTH)); 

要檢索的第一天,你可以先定義一個定製FIRST_DAY功能(不幸的是MySQL不提供任何):

DELIMITER ;; 
CREATE FUNCTION FIRST_DAY(day DATE) 
RETURNS DATE DETERMINISTIC 
BEGIN 
    RETURN ADDDATE(LAST_DAY(SUBDATE(day, INTERVAL 1 MONTH)), 1); 
END;; 
DELIMITER ; 

然後,你可以這樣做:

SELECT FIRST_DAY(DATE_ADD(CURRENT_DATE(), INTERVAL 1 MONTH)); 
+1

我們不能簡單地寫(last_day(current_date()+ interval 1 month))嗎? – 2014-06-05 18:47:28

+0

@UncleIroh,是的,我們可以,那也可以。但實際上有一個**更短的**解決方案:http://stackoverflow.com/a/28844641/632951 – Pacerier 2015-03-10 15:21:12

0

縮短查詢:

SELECT 
ADDDATE(LAST_DAY(NOW()), 1) AS firstOfNextMonth, 
LAST_DAY(DATE_ADD(NOW(), INTERVAL 1 MONTH)) AS lastOfNextMonth 
+0

['curdate'比較好](http://stackoverflow.com/a/28844641/632951)現在'在速度和意圖傳輸方面。另外,就可讀性和命令長度而言,「+」優於「DATE_ADD」。 – Pacerier 2015-03-10 15:19:35

14

下個月的第一天簡直是這個月的最後一天+ 1:

select adddate(last_day(curdate()), 1) 

最後一天下月僅僅是最後當天(今天+ 1個月):

select last_day(curdate() + interval 1 month)) 

這些是最直接的解決方案。你將無法找到更短的一個。


如果需要當前個月的第一天,看到https://stackoverflow.com/a/28966866/632951

0

爲了得到下個月的第一天: - select LAST_DAY(NOW()) + INTERVAL 1 DAY

要獲得下個月的最後一天: - select LAST_DAY(NOW()+ INTERVAL 1 Month)

相關問題