web-dev-qa-db-ja.com

joomlaクエリでconvert_tzを使用する方法

これは私の現在のクエリです:

_$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 ));
_

_publish_up_と正しく比較するために、_$uvdatetime_フィールドのタイムゾーンをUTCからEETに変換する必要があります。

検索後、以下のように_compare_tz_を試してみました。

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

ただし、次のメッセージが表示されます。

予期しないT_STRING

Joomlaクエリで_convert_tz_を使用する方法はありますか?

そうでない場合、この変換を達成するための別の/より良い方法はありますか?

編集:混乱を避けるために、このコードの目的を明確にする必要があります
私の最初の目標は、記事がTODAYと書かれたときにメニュー項目にクラススタイルを与えることです。
問題は、記事が00:00から03:00(EEST)までの公開日で保存されている場合、joomlaがそれをUTCとして保存することです。
例:「2018-09-04 01:00:00」は「2018-09-03 22:00:00」として保存されます。ある日遡ります...
これは私が変換しようとしているものです。時間と日付。私ははるかに単純なクエリを使用していました:

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

しかしそれでも.. convert_tzは機能しません

@mickmackusaの2番目のソリューション(そして間違いなく最良のソリューション)が機能するための最終ステップ

仕様:Centos 7.5、MariaDB 5.5、plesk 17.8

タイムゾーンをmysqlにロードする必要があります。(私は この優れた投稿 に従いました)

SELECT CONVERT_TZ('2012-06-07 12:00:00', 'GMT', 'America/New_York');を実行すると、nullが返されました。つまり、タイムゾーンは読み込まれません。

だから私はsshでログインして与えます

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

これは面倒なインストールであることを忘れないでください。面倒ではない場合は、「-u root」とmysqlパスワードを使用してください。 2つの警告が表示される場合があります

_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.
_

this に基づいています。

ゾーンが読み込まれました。前のクエリを実行してテストできます。

そして今、ミックのクエリを使用してタイムゾーンを適切に変換できます。

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

ヨーロッパ/アテネでEETを変更する必要があった

めっちゃすごい。乾杯!

3
JoePanpi

CONVERT_TZ()を使用する代わりに、クエリでINTERVALを使用して、夏時間を無視した変換を実行し、php変数の使用を回避できます。

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

これにより、現在の時刻と_publish_up_の時刻が繰り上げられるため、現在の日付に該当する行を特定できます。

ここにsqlfiddleがあります: http://sqlfiddle.com/#!9/859cd7/4


ただし、夏時間に敏感なソリューションの精度が必要な場合は、比較の両側でCONVERT_TZ()を使用できますが、省略形を処理するためにデータベースのタイムゾーンテーブルを更新する必要がある場合があります( Stackoverflowまたはそれ以上のウェブを検索して、これに関する指示を見つけることができます)。

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

*元のスニペットでは、[convert_tz()] [1]関数を文字列としてクエリビルダーに渡す必要があります。いくつかの括弧と引用符がありませんでした。

* _publish_up_は技術的にバッククォートを必要としないため、省略した場合のクエリは読みやすくなります。

2
mickmackusa

あなたが試したことに明らかなphp構文エラーがあります。 convert_tzはMySQL関数であり、MySQLで処理されるトリングとしてクエリ内で渡すために必要です。

以下のようなものを試してください:

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

最後に、 MySQL docs で名前付きタイムゾーンをconvert_tz 関数

1
FFrewin