Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    query *efficace* su campo data in epoch

    salve a tutti

    gestisco un forum e dovrei creare una pagina php che lancia una query sul database al fine di estrarre le discussioni che hanno avuto risposte nel mese passato.

    fino ad ora non facevo che inserire in un 2 campi i corrispettivi valori in epoch dell' 1/m/a 00:00:00 e dell'31/m/a 23:59:59 e lanciando il modulo la pagina eseguiva una query del tipo

    SELECT topic_title FROM phpbb_posts where post_time >= $epoch_start AND post_time <= $epoch_end

    quindi, ogni mese calcolavo l'epoch time di inizio e di fine periodo e lanciavo la query.

    ora, dato che la query si limita a cercare SEMPRE nei post del mese passato rispetto a quello corrente, pensavo di evitare di dover inserire a mano ogni volta gli epoch di inizio e fine periodo.

    quindi mi chiedo, è possibile lanciare una query del genere?

    SELECT topic_title FROM phpbb_posts where ( post_time è un epoch dello scorso mese)

    in pratica, come posso passare tramite SQL il comando di estrarre i post del mese passato? (se oggi è novembre 2007, voglio che estragga ottobre 2007; se la data corrente è gennaio 2007, voglio che estragga dicembre 2006)

    se è possibile, come si esprime in linguaggio SQL che quello che in linguaggio "umano" è ( post_time è un epoch dello scorso mese) ?

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Prova così
    codice:
    SELECT topic_title FROM phpbb_posts where 
    extract(year_month from(post_time)) = extract(year_month from(curdate() - interval 1 month))

  3. #3
    Originariamente inviato da nicola75ss
    Prova così
    codice:
    SELECT topic_title FROM phpbb_posts where 
    extract(year_month from(post_time)) = extract(year_month from(curdate() - interval 1 month))
    post_time e' un unix timestamp... se ho ben capito.


    piuttosto non vedo perche' debba calcolare ogni mese inizio-fine. Con quello che costa meglio farglielo fare al php....

    codice:
    $epoch_start = mktime(0,0,0, date('m') - 1, 1, date('Y'));
    $epoch_end =  mktime(23,59,59, date('m') , 0, date('Y'));
    
    SELECT topic_title 
    FROM phpbb_posts 
    where post_time between $epoch_start AND $epoch_end


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

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Eh sì, mi sa che hai ragione.
    Ciao Piero, buona notte.

  5. #5
    si, post_time è in timestamp

    so che posso fare calcolare inizio e fine periodo da php ma mi chiedevo se si potesse fare esclusivamente tramite SQL

    a quanto pare no

    grazie cmq

  6. #6
    Originariamente inviato da netmoney
    si, post_time è in timestamp

    so che posso fare calcolare inizio e fine periodo da php ma mi chiedevo se si potesse fare esclusivamente tramite SQL

    a quanto pare no

    grazie cmq
    e perche' non si puo? La soluzione in php era solo per dire che il calcolo lo script lo puo' fare da se, come con SQL, senza intervenire manualmente ogni mese come avevi scritto tu..

    codice:
    SELECT topic_title 
    FROM phpbb_posts 
    where 
    from_unixtime(post_time, '%Y%m') = extract(year_month from(curdate() - interval 1 month))

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

  7. #7
    grazie piero.mac

    avevo letto male e mi ero convinto non fosse possibile farlo con SQL. ho applicato la query così come l'hai riportata e funziona

    ultima domanda: a gennaio 2008 quando eseguirò la query, otterò quindi i post che hanno avuto risposta a dicembre 2007 (anno precedente rispetto al 2008)?

    te lo chiedo perchè l'altro codice che avevi postato

    $epoch_start = mktime(0,0,0, date('m') - 1, 1, date('Y'));
    $epoch_end = mktime(23,59,59, date('m') , 0, date('Y'));

    se non sbaglio fa riferimento sempre a date('Y'), quindi all'anno corrente

    grazie mille per il tuo aiuto

  8. #8
    se utilizzi le funzioni preposte mktime() o quelle di MySQL addizionando/sottraendo giorni, mesi hai automaticamente l'adeguamento dell'anno, se del caso.

    unix timestamp e' un valore assoluto in secondi dall'Epoch time predefinito. Quindi le funzioni che traducono il unix timestamp lo fanno sul valore assoluto tenendo conto della variabilita' di mesi e anni bisestili...

    mese = date('m') - 1 rappresentera' la sottrazione di un mese in secondi dalla data unix corrente e non solo di un mese -1 rispetto al mese di riferimento.

    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 © 2025 vBulletin Solutions, Inc. All rights reserved.