2010-06-09 10 views

risposta

36

Usa:

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 per risparmiare molte ore – dakshbhatt21

+0

Per altre funzioni relative al tempo MySQL come questa, vedere [questo post del blog] (http://sys-exit.blogspot.com/2013/06/mysql-today-tomorrow-yesterday- this.html) – ducin

+0

@OMGPonies, usa 'cagliadella' invece di' ora() 'perché non abbiamo bisogno dei tempi. Inoltre, per il primo giorno, è più semplice [semplicemente il numero di giorni del mese in corso] (http://stackoverflow.com/a/28844641/632951). È anche più veloce perché stiamo facendo solo una singola chiamata 'date_sub()' e una singola chiamata 'day()'. – Pacerier

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); 

non sono sicuro che sia le query più brevi, ma lo fanno lavorare

+0

Qual è la performance di questa soluzione contro la soluzione di Ponies? – Pacerier

27

Per l'ultimo giorno del mese successivo, è possibile utilizzare la funzione di 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) 

Alcuni casi limite testati:

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) 

C'è anche un uso complicato della funzione DATE_FORMAT() t o prendi il primo giorno di un mese. Si può usare come segue:

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) 

Pertanto:

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 restituisce un 'var_string', non una data. Usa invece la mia soluzione. – Pacerier

0

in PostgreSQL voi hanno perfette funzioni data di troncamento.

Per MySQL, ho trovato una discussione here che potrebbe dare qualche idea.

+0

Buon collegamento in realtà, ma si desidera includere il contenuto di questa pagina. Cosa intendi per funzione di troncatura data comunque? – Pacerier

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

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

select year(getdate()) 
+1

Penso che la tua risposta sia per SQL Server;). –

0

Ecco tutte le possibili soluzioni. Spero che questo vi aiuterà ... basta eseguire questo per ottenere tutti i dettagli

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

Come @DanielVassallo spiegato, recuperando l'ultimo giorno del mese prossimo è facile:

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

Per recuperare il primo giorno, si potrebbe prima definire una funzione personalizzata FIRST_DAY (purtroppo MySQL non fornisce alcuna):

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

E poi si potrebbe fare:

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

Non possiamo semplicemente scrivere (last_day (current_date() + interval 1 month))? –

+0

@UncleIroh, Sì, possiamo farlo, anche questo funziona. Ma c'è in realtà una soluzione ** ancora più breve **: http://stackoverflow.com/a/28844641/632951 – Pacerier

0

Shorter:

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

['curdate' è meglio] (http://stackoverflow.com/a/28844641/632951) di' ora in termini di velocità e trasporto intenzionale. Inoltre, '+' è migliore di 'DATE_ADD' in termini di leggibilità e lunghezza del comando. – Pacerier

14

Primo giorno del prossimo mese è semplicemente l'ultimo giorno di questo mese + 1:

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

Ultimo giorno del prossimo mese è semplicemente scorso giorno di (oggi + 1 mese):

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

Queste sono le soluzioni più semplici. Non sarai in grado di trovarne uno più corto.


Se è necessario il primo giorno del corrente mese , vedi https://stackoverflow.com/a/28966866/632951

0

Per ottenere prima data del prossimo mese: - select LAST_DAY(NOW()) + INTERVAL 1 DAY

Per ottenere ultima data del prossimo mese: - select LAST_DAY(NOW()+ INTERVAL 1 Month)

Problemi correlati