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
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é!
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.
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