2009-08-03 6 views
0

Ma requête reçoit actuellement les données d'hier, mais je veux maintenant obtenir toutes les données des derniers mois. (E.g.from 1er au 31)Obtention des données des derniers mois à partir de la base de données

$res = mysql_query("SELECT 
FROM_UNIXTIME(enquiry_time), `id` , 
`fullname` , `address1` , `citytown` , 
`postcode` , `telno` , 
`property_value` ,`total_secured_debt` 
, `email` , `on_market` , `agent` , 
`reason` , `price_concession` , 
`asking_price` , `form_page` FROM 
$table WHERE TO_DAYS(FROM_UNIXTIME(enquiry_time)) = (TO_DAYS(NOW())-1) 
"); 

Il n'y a pas TO_MONTHS si je ne suis pas sûr où commencer!

Répondre

0

Vous cherchez la fonction MONTH? Cela fonctionnera (comme le fait maintenant votre TO_DAYS), mais n'oubliez pas que vous payez peut-être un prix élevé si la table est grande: MySQL ne peut pas utiliser un index lorsque la condition WHERE dépend d'une fonction plutôt que directement la colonne indexée (utilisez EXPLAIN pour voir le plan de requête et confirmez que c'est le cas). Au niveau des performances, il est préférable de calculer les limites inférieure et supérieure des heures que vous voulez voir (avec les fonctions et l'arithmétique sur NOW()), puis d'utiliser une ligne droite BETWEEN dans votre WHERE. Encore une fois, utilisez EXPLAIN pour vérifier - essayer de deviner que l'optimiseur de requête de MySQL est un exercice stérile, il est beaucoup plus facile de vérifier ce qu'il prévoit de faire ;-).

3

Essayez:

$res = mysql_query(" 
    SELECT FROM_UNIXTIME(`enquiry_time`), `id`, `fullname`, `address1`, 
     `citytown`, `postcode`, `telno`, `property_value`, `total_secured_debt`, 
     `email`, `on_market`, `agent`, `reason`, `price_concession`, 
     `asking_price`, `form_page` 
    FROM $table 
    WHERE YEAR(FROM_UNIXTIME(`enquiry_time`)) = YEAR(CURDATE() - INTERVAL 1 MONTH) 
    AND MONTH(FROM_UNIXTIME(`enquiry_time`)) = MONTH(CURDATE() - INTERVAL 1 MONTH) 
"); 

Cela fonctionnera tous largement mieux et plus vite si enquiry_time étaient un champ DATE ou DATETIME natif, avec un index, au lieu d'un horodatage Unix.

0

Pourriez-vous utiliser quelque chose comme ce qui suit? Je pense que ça va te donner ce que tu veux.

FROM_UNIXTIME(enquiry_time) 
BETWEEN date_format(NOW() - INTERVAL 1 MONTH, '%Y-%m-01') 
AND last_day(NOW() - INTERVAL 1 MONTH) 

Voici the reference.

0

Bien que la réponse du chaos fonctionne, si $table est indexé par enquiry_time, , il sera plus rapide de comparer directement avec ce champ qu'avec une fonction de celui-ci. qui transforme sa réponse dans le même plus laid:

$res = mysql_query(" 
    SELECT FROM_UNIXTIME(enquiry_time), id, fullname, address1, 
     citytown, postcode, telno, property_value, total_secured_debt, 
     email, on_market, agent, reason, price_concession, asking_price, 
     form_page 
    FROM $table 
    WHERE enquiry_time >= UNIX_TIMESTAMP(concat(year(curdate() - interval 1 month), '-', month(curdate() - interval 1 month), '-01')) 
    AND enquiry_time < UNIX_TIMESTAMP(concat(year(curdate()), '-', month(curdate()), '-01')) 
"); 
0

Je vois que vous utilisez php donc cela pourrait être mieux que la lutte avec les fonctions de MySQL:

$end_of_month = strtotime(date('Y-m-01 00:00:00'))-1; 
$start_of_month = strtotime(date('Y-m-01 00:00:00',$end_of_month)); 

$res = mysql_query("SELECT 
FROM_UNIXTIME(enquiry_time), `id` , 
`fullname` , `address1` , `citytown` , 
`postcode` , `telno` , 
`property_value` ,`total_secured_debt` 
, `email` , `on_market` , `agent` , 
`reason` , `price_concession` , 
`asking_price` , `form_page` FROM' 
$table WHERE enquiry_time >= '".$start_of_month."' AND enquiry_time <= '".$end_of_month."' 
"); 
Questions connexes