Zum Inhalt springen

strftime in select/where

Erstellt am 22. Juli 2010 · 6 Antworten · letzte Antwort am 26. Juli 2010

Tags: Frage

eddy ·

Hallo zusammen,

ich versuche, im "where-Abschnitt" einer Select-Anweisung eine übergebene GET-Variable mit einem Datenbankfeld zu vergleichen.

Die GET-Variable beinhaltet eine Jahreszahl (vierstellig) und soll mit dem Datenbankfeld "datetime", das ein Datum im Timestamp-Format enthält, verglichen werden.
Daher müsste ja auf das Datenbankfeld zuvor ein strftime angewendet werden, damit beide Felder vergleichbar werden.

Nur wie baue ich dies in die where-Klausel ein?

Verschiedene Ansätze scheiterten. Es muss irgendwie in der Art funktionieren:

select.where = GPvar:tx_ttnews|year = strftime(datetime)

bzw. mit addWhere:

select.addWhere.dataWrap = GPvar:tx_ttnews|year = strftime(datetime)

Leider tut sich nix.
Wie lässt sich denn die strftime-Funktion entsprechend nutzen? Geht das überhaupt in der where-Klausel? Muss das evtl. an anderer Stelle geschehen?

Im darauffolgenden renderObj kann ich das vermutlich wohl nicht machen, da hier der Vergleich schon stattgefunden haben muss.

Bin mal wieder rat- und planlos. Hoffe Ihr habt einen Tipp für mich.
Eddy

einpraegsam.​net ·

Ich bin mir gerade nicht sicher, ob man in der where clause auch cObject nutzen kann. Falls ja, kannst du den GET Parameter umwandelt. Falls nein musst du dir wohl mit PHP aushelfen...

eddy ·

Danke für den Hinweis. Leider muss ich das datetime-Feld anpassen, welches dann in jedem Datensatz mit dem GET Parameter verglichen werden muss.

Ehrlich gesagt befürchte ich aber auch, um PHP nicht drumherumzukommen, obwohl ich es sehr gerne mit Typoscript gelöst hätte. #paralyzed#

eddy ·

Hallo karlchen,

das wäre es natürlich gewesen. Eine einfache und elegante Lösung. Leider zieht es nicht und es werden keine Datensätze gefunden. Habe schon am Ausdruck selber etwas experimentiert mit/ohne Hochkomma usw. leider ohne Erfolg.

Wie einprägsam.net schon schrieb werde ich mich wohl mit einer php-Lösung anfreunden müssen 😉

karlchen ·

und es geht doch 😃

ich habe gerade auch mal ein bisschen rumprobiert und habe bei mir noch einen Fehler gefunden, DATE_FORMAT erwartet ein Datum und keinen Timestamp...

So funktioniert es bei mir gerade

10=CONTENT
10{
	wrap = <ul>|</ul>
  	table = tt_news
		select{
            // auf dieser Seite liegen die tt_news Datensätze
			pidInList = 151
			orderBy = datetime Desc
			languageField = sys_language_uid
			selectFields = datetime,title,uid
			andWhere.data = GPvar:tx_ttnews|year
			andWhere.intval = 1
            // standardwert falls keine tx_ttnews|year übergeben wird
            // um mysql Errors zu vermeiden
			andWhere.stdWrap.outerWrap.wrap = 2009 |
			andWhere.stdWrap.outerWrap.if{
				isFalse.data = GPvar:tx_ttnews|year
			}
			andWhere.wrap = | = FROM_UNIXTIME(tt_news.datetime, '%Y')
		}

		renderObj = COA
		renderObj{
						
			20 = TEXT
			20{
				outerWrap = <li>|</li>
				field = title
                // auf diese Seite wird verlinkt (tt_news singleView)
				typolink.parameter = 112
				typolink.additionalParams.dataWrap = &tx_ttnews[tt_news]={field:uid} 
				}
		}
}

TypoScript ist doch einfach goil 😃

eddy ·

Hallo karlchen,

saubere Arbeit - Respekt 🙂
Der übergebene GET-Parameter wird entsprechend ausgewertet und es wird eine Ergebnisliste ausgespuckt.

Ich muss nun zusätzlich noch diese Ergebnisse einschränken mit

archivedate < {date:U}

also irgendwie hineinwrappen. Mit einem einfachen "where" komme ich nicht weiter. Ich verbiege mir hier gerade einen mit diversen andWhere.stdWrap-Konstruktionen, komme jedoch auf keinen grünen Zweig.
Hast Du evtl. einen Tipp, wie ich das da noch hineinwursteln kann?

Eddy