Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Moderatore di Server Apache L'avatar di marketto
    Registrato dal
    Sep 2001
    Messaggi
    5,858

    [mySQL] query per compleanno...esiste una versione più semplice??

    ciao, il codice che posto (e che funziona) permettere di ricavare i 2 compleanni più vicini alla data odierna...la domanda è questa: esiste una query più snella per fare la stessa cosa??

    codice:
    /*
    CREATE TABLE `tabella` (
      `nome` varchar(10) default NULL,
      `nato_il` date NOT NULL default '0000-00-00'
    ) TYPE=ISAM;
    
    INSERT INTO `tabella` VALUES ('Paolo', '1980-04-31');
    INSERT INTO `tabella` VALUES ('Andrea', '1956-12-05');
    INSERT INTO `tabella` VALUES ('Gianni', '1978-09-14');
    INSERT INTO `tabella` VALUES ('Anna', '1994-10-23');
    INSERT INTO `tabella` VALUES ('Luca', '1972-08-09');
    */    
    
    $sql="SELECT nome,DATE_FORMAT(nato_il,'%d/%m/%y') AS data,
    	DATE_FORMAT(nato_il + INTERVAL
    	IF(
    	DATE_FORMAT(nato_il + INTERVAL YEAR(NOW()) - YEAR(nato_il) YEAR,'%Y-%m-%d') >= CURDATE()
    	,YEAR(NOW()) - YEAR(nato_il),
    	YEAR(NOW()) - YEAR(nato_il)+1)
    	YEAR,'%Y-%m-%d') AS datanorma
    	FROM tabella
    	ORDER BY datanorma ASC
    	LIMIT 0,2";
    $st=mysql_query($sql) or die(mysql_error());
    while ($row=mysql_fetch_assoc($st))
    	echo $row['nome']." ".$row['data']."
    \n";
    //Anna 23/10/94
    //Andrea 05/12/56
    think simple think ringo

  2. #2
    sembra una cosa per la settimana enigmistica.....

    ma ti interessano i due piu' vicini, passati o futuri o solo i futuri???

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Moderatore di Server Apache L'avatar di marketto
    Registrato dal
    Sep 2001
    Messaggi
    5,858
    Originariamente inviato da piero.mac
    sembra una cosa per la settimana enigmistica.....
    meglio del bartezzaghi

    Originariamente inviato da piero.mac
    ma ti interessano i due piu' vicini, passati o futuri o solo i futuri???
    i due più vicini futuri
    think simple think ringo

  4. #4
    Originariamente inviato da marketto
    meglio del bartezzaghi
    i due più vicini futuri
    Tanto per semplificare potresti estrarre l'anno con la funzione YEAR(nato_il) invece di DATE_FORMAT(nato_il,'%Y'), poi se proprio insisti mi metto li a dare i numeri (come faccio di solito)..... Mi fa un po' senso pero' farlo per te.....


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    Moderatore di Server Apache L'avatar di marketto
    Registrato dal
    Sep 2001
    Messaggi
    5,858
    Originariamente inviato da piero.mac
    Tanto per semplificare potresti estrarre l'anno con la funzione YEAR(nato_il) invece di DATE_FORMAT(nato_il,'%Y'), poi se proprio insisti mi metto li a dare i numeri (come faccio di solito)..... Mi fa un po' senso pero' farlo per te.....

    la mia era semplice curiosità: credo che il problema non sia del tutto banale, ma una query così è bella grossa...

    intanto metto lo YEAR



    EDIT:
    ho editato la query mettendo year al posto di date_format...
    think simple think ringo

  6. #6
    Originariamente inviato da marketto
    la mia era semplice curiosità: credo che il problema non sia del tutto banale, ma una query così è bella grossa...

    intanto metto lo YEAR



    EDIT:
    ho editato la query mettendo year al posto di date_format...
    nella vita bisogna sempre pensare semplice....

    dell'anno chi se ne frega, giusto? cosa serve sapere? le prime due date presenti a partire da oggi... prova tu che a me vien .. hem... non ho la tabella....

    codice:
    $sql="SELECT nome, DATE_FORMAT(nato_il,'%d/%m/%y') AS data,
    if(DAYOFYEAR(nato_il) >= DAYOFYEAR(now()),
    DAYOFYEAR(nato_il) + DAYOFYEAR(now()),
    DAYOFYEAR(nato_il) + DAYOFYEAR(now()) + 365) AS numb
    FROM tabella
    ORDER BY numb asc";
    Il problema da risolvere e' quello delle date del prossimo anno...

    puoi vedere da te come l'ho risolto...


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  7. #7
    Moderatore di Server Apache L'avatar di marketto
    Registrato dal
    Sep 2001
    Messaggi
    5,858
    c'era una parentesi nel posto sbagliato, ma era un dettaglio.
    per funzionare funziona, solo che non restituisce il compleanno nel caso sia il giorno stesso...cmq dai, è già un buon passo avanti...domani provo a metterci le mani, in caso mi tengo la mia


    thx
    think simple think ringo

  8. #8
    Originariamente inviato da marketto
    solo che non restituisce il compleanno nel caso sia il giorno stesso...
    proprio perche' sei tu .... ho fatto la tabella e provato...
    codice:
    SELECT nome, DATE_FORMAT( nato_il, '%d/%m/%y' ) AS DATA , 
    IF (DAYOFYEAR(nato_il) >= DAYOFYEAR(now()), 
    DAYOFYEAR(nato_il) + DAYOFYEAR(now()), 
    DAYOFYEAR(nato_il) + DAYOFYEAR(now()) + 365 ) AS numb, 
    NOW() AS oggi
    FROM tabella
    ORDER BY numb ASC
    risultato:
    codice:
    nome   DATA      numb  oggi  
    Roby   02/10/00  552   2004-10-02 00:20:13 
    Anna   23/10/94  572   2004-10-02 00:20:13 
    Andrea 05/12/56  616   2004-10-02 00:20:13 
    Paolo  31/04/80  763   2004-10-02 00:20:13 
    Luca   09/08/72  863   2004-10-02 00:20:13 
    Gianni 14/09/78  898   2004-10-02 00:20:13
    Pippo  01/10/04  916   2004-10-02 00:20:13
    OHHH! come funzionaaaa.....


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  9. #9
    Moderatore di Server Apache L'avatar di marketto
    Registrato dal
    Sep 2001
    Messaggi
    5,858
    Originariamente inviato da piero.mac
    proprio perche' sei tu ....
    mmmmmm


    una cosa xò nn mi torna: partendo da questi dati, con la data di sistema odierna (2 ottobre 2004) viene fuori il risultato corretto, mentre mettendo, per esempio, il 28 ottobre 2004 il gioco non funziona più (ed è per questo che prima ti avevo scritto quella cosa)...

    data 2 ottobre 2004
    codice:
     nome   	  DATA   	  numb   	  oggi
    Roby 		02/10/00 	552 	2004-10-02 01:01:24
    Ornella 	28/10/78 	577 	2004-10-02 01:01:24
    Stefania 	14/11/80 	595 	2004-10-02 01:01:24
    Alessandra 	19/01/81 	660 	2004-10-02 01:01:24
    Alberto 	26/02/82 	698 	2004-10-02 01:01:24
    Andrea 		23/06/68 	816 	2004-10-02 01:01:24
    Alessandro 	01/07/78 	823 	2004-10-02 01:01:24
    Federico 	05/09/83 	889 	2004-10-02 01:01:24
    data 28 ottobre 2004
    codice:
     nome   	  DATA   	  numb   	  oggi
    Stefania 	14/11/80 	621 	2004-10-28 01:04:12
    Alessandra 	19/01/81 	686 	2004-10-28 01:04:12
    Alberto 	26/02/82 	724 	2004-10-28 01:04:12
    Andrea 		23/06/68 	842 	2004-10-28 01:04:12
    Alessandro 	01/07/78 	849 	2004-10-28 01:04:12
    Federico 	05/09/83 	915 	2004-10-28 01:04:12
    Roby 		02/10/00 	943 	2004-10-28 01:04:12
    Ornella 	28/10/78 	968 	2004-10-28 01:04:12

    dump tabella
    codice:
    CREATE TABLE `tabella` (
      `nome` varchar(10) default NULL,
      `nato_il` date NOT NULL default '0000-00-00'
    ) TYPE=ISAM PACK_KEYS=1;
    
    INSERT INTO `tabella` VALUES ('Alberto', '1982-02-26');
    INSERT INTO `tabella` VALUES ('Alessandro', '1978-07-01');
    INSERT INTO `tabella` VALUES ('Ornella', '1978-10-28');
    INSERT INTO `tabella` VALUES ('Federico', '1983-09-05');
    INSERT INTO `tabella` VALUES ('Andrea', '1968-06-23');
    INSERT INTO `tabella` VALUES ('Stefania', '1980-11-14');
    INSERT INTO `tabella` VALUES ('Alessandra', '1981-01-19');
    INSERT INTO `tabella` VALUES ('Roby', '2000-10-02');
    think simple think ringo

  10. #10


    Now() conta anche le ore minuti secondi.... scusa dimenticavo ...


    In mancanza di questi considera il default di 00:00:00

    usa CURDATE invece di NOW()




    Ps.: dimenticavo ..... 01:00:00 perche' ora legale

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.