Prelevare i record che appartengono al giorno più vecchio del mese.

  • Creatore Discussione Creatore Discussione criccroc
  • Data di inizio Data di inizio

criccroc

Utente Attivo
7 Gen 2011
44
0
6
Ho la necessità di prelevare da una tabella soltanto i record che appartengono al giorno più vecchio del mese. Faccio un esempio:

Data
18/12/04
*31/12/04
14/01/05
18/01/05
*25/01/05
04/02/05
11/02/05
*19/02/05
01/03/05
*16/03/05
*01/04/05
01/08/05
*28/08/05

in questo esempio ho la necessità quindi di prelevare soltanto le date con * (ovvero 6 record).

Qualcuno sa suggerirmi l'SQL da utilizzare? Grazie.
 
Codice:
select max(DateStr) as DateStr from DateTab
group by RIGHT(DateStr, 2)+SUBSTRING(DateStr,3,3)

Cattura.PNG
 
Mi sono dimenticato di aggiungere che..

1) devo selezionare tutti i campi del database (non solo la data)
2) l'anno e' in formato americano (Es: 2014-11-27).

Nel frattempo sto provando la select modificando i parametri. Vediamo se ci riesco da solo, ma se nel frattempo si ha la soluzione sarebbe meglio :) GRAZIE.
 
Per ora ho risolto il filtraggio dei record con la data americana utilizzando questo comando:

select max(data) as data from NomeTabella group by LEFT(data, 7)

Difatti, cosi facendo visualizzo solo le date dei record che mi interessano. Mi manca solo di modificare l'sql in modo di poter vedere TUTTI I CAMPI.
 
si "left" funziona con mysql su un campo data, non con ms sql, in ogni caso prova
Codice:
select * from DateTab a 
inner join 
(
  select max(DateDt) as DateDt from DateTab group by month(DateDt), year(DateDt)
) b
on a.DateDt=b.DateDt

non perdere per strada "a" e "b" altrimenti non funziona
 
Perdonami marino51, preferirei semplicemente modificare l'sql che ti ho postato per ultimo (che funziona ed e' piu chiaro):
Codice:
select max(data) as data from NomeTabella group by LEFT(data, 7)

aggiungendo la parte mancante tipo: select * where... ????
 
no no ... sostituisci il mio "group by month, year" con il tuo "left"
poi ... quella è la query
(non puoi mixare campi raggruppati con campi non ... e select max(DateDt) ... restituisce più di un record)

ps DateDt è di fatto DateStr, solo, in formato "datetime" nel mio db
 
Ultima modifica:
OK marino51, grazie di nuovo!
cosi funziona:
Codice:
select * from NomeTabella a inner join (select max(data) as data from NomeTabella group by LEFT(data, 7)) b on a.data=b.data
 
Ora qualcuno mi uccide :evil::evil::evil:

La mia sql e' leggermente più complessa. In origine era questa:

Codice:
$sql = "SELECT * FROM NomeTabella WHERE (data BETWEEN '$data_inizio' AND '$data_fine') AND (NumSet = 9) ORDER BY id DESC LIMIT 10;

quindi.. vengono filtrati in questo caso i record compresi tra una data iniziale e una finale, Numero settimana = 9, in ordine di ID, limitato a 10 record.

Poi ho modificato la parte NumSet filtrando solo le date dell'ultimo mese, con la query di prima.

Ora pero' devo aggiungere anche questi altri parametri. SIGH SIGH :(
 
mi manca solo il WHERE
Codice:
WHERE (data BETWEEN '1999-01-01' AND '2012-03-06')
ed ho terminato.

Per ora sono arrivato qui:

Codice:
$sql= "SELECT * FROM NomeTabella a INNER JOIN (SELECT MAX(data) AS data from NomeTabella group by LEFT(data, 7)) b on a.data=b.data ORDER BY id DESC LIMIT 100";
 
Ok.. finalmente problema risolto:
Codice:
$sql = "SELECT * FROM NomeTabella a INNER JOIN (SELECT MAX(data) AS data FROM NomeTabella WHERE (data BETWEEN '1999-01-01' AND '2000-03-06') GROUP BY LEFT(data, 7)) b ON a.data=b.data ORDER BY id DESC LIMIT 100";

Cosi facendo ho filtrato tutte le date del giorno più vecchio del mese, compresi tra un certo periodo di data, ordinate per codice, limitando a 100 il numero dei record selezionati. GRAZIE INFINITE!
 

Discussioni simili