2010-01-01 3 views
1

Je tape sur la base de données pour une centaine d'enregistrements à partir d'une base de données MySQL qui ont une colonne DateAdded (timestamp). Je voudrais trouver un moyen SMART pour afficher les enregistrements comme suit dans Coldfusion, sans frapper la base de données plusieurs fois.Coldfusion, sortie des résultats SQL regroupés par date de regroupement, aujourd'hui, hier, cette semaine, etc

Aujourd'hui: - records ..... hier: - records ..... Plus tôt cette semaine: - records ..... Ce mois-ci: - records .... Plus anciens: - enregistrements .....

Merci pour les idées sur la façon de procéder intelligemment dans ColdFusion.

Répondre

2

requêtes de requêtes? - http://livedocs.adobe.com/coldfusion/8/htmldocs/using_recordsets_3.html#1157970

<h1>Today:</h1> 
<cfquery name="todayRecords" dbtype="query"> 
    select * 
    from originalQuery 
    where DateAdded = #createODBCDate(year(now()), month(now()), day(now()))# 
</CFQUERY> 
<cfdump var="#todayRecords#"> 

Vous pouvez utiliser l'opérateur BETWEEN SQL. Voir: http://livedocs.adobe.com/coldfusion/8/htmldocs/using_recordsets_7.html

Vous pouvez également utiliser la balise <cfqueryparam>. Voir: http://livedocs.adobe.com/coldfusion/8/htmldocs/Tags_p-q_18.html#1102474

L'interrogation de requêtes n'est peut-être pas la plus efficace, mais à mon avis, c'est le moyen le plus propre de représenter votre intention et cela fonctionne.

+0

Si la colonne est réellement un horodatage et contient à la fois une date et une heure, une comparaison d'égalité directe ne fonctionnera pas. Une vérification de plage (ou de tronquage de l'heure) serait nécessaire. OERE DateAdded <= # TodayAtMidnight # ET DateAdded <# TomorrowAtMidnight # – Leigh

+0

La fonction d'édition ne semble pas fonctionner. Correction: O WH DateAdded> = # TodayAtMidnight # ET DateAdded <# TomorrowAtMidnight # – Leigh

+0

@Leigh, oui, et vous pouvez utiliser entre – Henry

1

plusieurs appels db auraient un coût assez négligeable dans la plupart des applications

mais cela peut être fait en un seul appel, si vous SELET tous les enregistrements et l'ordre par le temps desc.

fin de la section courante lorsque les commutateurs de temps (quand il devient plus de 1 jour, plus de 2 jours, plus de 8 jours, etc.)

vous utiliser essentiellement DateCompare fonction dans les FC pour comparer DateAdd que point de coupure de la section. certains pseudo-code:

aujourd'hui

tandis que dateadd < demain print Enregistrement

hier

en dateadd < il y a 1 semaine print enregistrement

plus tôt cette semaine

tandis que dateadd < il y a 1 mois imprimer la fiche

+0

Comment puis-je faire l'interrupteur dans Coldfusion avec élégance? – AnApprentice

+0

Vous pouvez faire le "commutateur" en gardant une variable qui garde la trace de la section que vous êtes. Lorsque cette section ne correspond plus à "LastSection", créez l'en-tête suivant. –

+0

Neil pouvez-vous donner un exemple dans CF qui montre comment cette boucle fonctionnerait? – AnApprentice

1

vous devez démarrer du côté SQL, soit une procédure de magasin ou une fonction définie par l'utilisateur pour ajouter le label Today/Yesterday/etc à chaque enregistrement.

Peut-être:

Select a, b, myFunction(DateColumn) as GroupLabel 
From myTable Order By GroupLabel 

Où maFonction prend la valeur de date et retourne Aujourd'hui/Hier/etc

+0

Pourquoi était-ce downvoted? –

+0

Cette approche est excellente et fonctionnera également pour tous les rapports ad-hoc conçus directement contre la base de données. – Antony

0

Je suis d'accord avec Neil.Si c'était moi, je ferais tout cela dans un processus stocké et laisserais la DB remettre les résultats finaux à la DB.

Questions connexes