web-dev-qa-db-fra.com

Comment utiliser convert_tz dans une requête joomla?

Ceci est ma requête actuelle:

$uvdatetime = JFactory::getDate('now', new DateTimeZone('Europe/Athens')); 

$db = JFactory::getDbo();
$query = $db->getQuery(true); 
$query->select("distinct ". $db->quoteName('catid'));
$query->from($db->quoteName('jos_k2_items'));
$query->where($db->quoteName('publish_up') .' <= '. $db->quote( $uvdatetime ));

Je dois convertir le fuseau horaire du champ publish_up De UTC à EET afin de pouvoir comparer correctement avec $uvdatetime.

Après avoir cherché, j’ai essayé d’utiliser compare_tz Comme ci-dessous.

$query->where convert_tz($db->quoteName('publish_up'),'GMT','EET') .' <= '. $db->quote( $uvdatetime );

Cependant, je reçois le message suivant:

t_STRING inattendu

Est-il possible d'utiliser convert_tz Dans une requête joomla?

Si non, existe-t-il un moyen différent/meilleur d’accomplir cette conversion?

EDIT: je dois clarifier le but de ce code pour éviter toute confusion
Mon objectif initial est de donner un style de classe à un élément de menu lorsqu'un article est écrit AUJOURD'HUI.
Le problème est que si un article est enregistré avec une date de publication comprise entre 00:00 et 03:00 (EEST), joomla l’enregistre au format UTC.
Ainsi, par exemple: "2018-09-04 01:00:00" est enregistré sous "2018-09-03 22:00:00". ça remonte un jour ...
C’est ce que j’essaie de convertir. l'heure et la date. J'utilisais une requête beaucoup plus simple:

$query = "SELECT DISTINCT catid FROM jos_k2_items WHERE DATE(publish_up)>=CURDATE()";

mais toujours .. convert_tz ne fonctionne pas

Dernières étapes pour que la deuxième solution de order @ mickmackusa (et certainement la meilleure) fonctionne

Spécifications: Centos 7.5, MariaDB 5.5, plesk 17.8

nous devons charger les fuseaux horaires sur mysql. (Je l'ai suivi cet excellent post )

je lance SELECT CONVERT_TZ('2012-06-07 12:00:00', 'GMT', 'America/New_York'); et il renvoie null. cela signifie que les fuseaux horaires ne sont pas chargés.

donc je me suis connecté avec ssh et donne

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u admin -p`cat /etc/psa/.psa.shadow` mysql

rappelez-vous que ceci est une installation de plesk. utilisez votre "racine -u" et votre mot de passe mysql si ce n'est pas plesk. vous pouvez recevoir 2 avertissements

Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it.

basé sur ceci vous êtes prêt à partir.

maintenant les zones sont chargées. vous pouvez exécuter la requête précédente pour la tester.

et maintenant nous pouvons utiliser la requête de mick pour convertir le fuseau horaire correctement.

 $query->where("DATE(CONVERT_TZ(publish_up, 'GMT', 'Europe/Athens')) = DATE(CONVERT_TZ(NOW(), 'GMT', 'Europe/Athens'))");

dû changer EET avec Europe/Athènes

plutot cool. à votre santé!

3
JoePanpi

Plutôt que d'utiliser CONVERT_TZ(), vous pouvez utiliser INTERVAL dans votre requête pour exécuter une conversion daylight-saving-ignorant et éviter l'utilisation d'une variable php.

$query->where("DATE(publish_up + INTERVAL 3 HOUR) = DATE(NOW() + INTERVAL 3 HOUR)");

Cela repoussera l’heure actuelle et l’heure publish_up Afin que vous puissiez déterminer les lignes correspondant au jour actuel.

Voici un sqlfiddle: http://sqlfiddle.com/#!9/859cd7/4


Toutefois, si vous avez besoin de la précision d'une solution tenant compte de l'heure avancée, vous pouvez utiliser CONVERT_TZ() des deux côtés de la comparaison. Toutefois, vous devrez peut-être mettre à jour la table du fuseau horaire de votre base de données pour gérer les abréviations (vous peut rechercher Stackoverflow ou le grand Web pour trouver des instructions à ce sujet).

$query->where("DATE(CONVERT_TZ(publish_up, 'GMT', 'EET')) = DATE(CONVERT_TZ(NOW(), 'GMT', 'EET'))");

* Dans votre extrait de code d'origine, vous devez transmettre la fonction [convert_tz ()] [1] en tant que chaîne au générateur de requêtes. Il vous manquait quelques parenthèses et citations.

* publish_up Ne nécessite techniquement pas de backtick, votre requête sera plus facile à lire si elle est omise.

2
mickmackusa

Il y a des erreurs évidentes de syntaxe php dans ce que vous avez essayé. Le convert_tz est une fonction MySQL et vous en avez besoin pour la passer dans la requête sous forme de requête à traiter par MySQL.

Essayez quelque chose comme ci-dessous:

$query->where('convert_tz('. $db->quoteName('publish_up').', "+00:00","+03:00") <= '. $db->quote( $uvdatetime ));

Enfin, vous voudrez peut-être consulter la documentation de MySQL sur l'utilisation des fuseaux horaires nommés avec le convert_tz une fonction

1
FFrewin