11

次のような最終更新日(タイムスタンプですが、bigint(20)列として)を取得するクエリがあります。

SELECT a.id_workorder, MAX(b.update_date) AS udpate_date
FROM main_log a, 
(
    SELECT MAX(log_date) AS update_date, log_id 
    FROM log_a
    GROUP BY log_id
    UNION
    SELECT MAX(log_date) AS update_date, log_id 
    FROM log_b
    GROUP BY log_id
)b
WHERE a.id_log = b.log_id
GROUP BY b.log_id

そして、あらゆる種類のログ (a または b) の最終更新日 (bigint(20) としての UNIX タイムスタンプ) を返します。

id          last update
-------------------------
1001        1376750476349
1002        1376753690861
1003        1378122801986
1004        1377764414858
1005        1377847226096
...

ここで、戻り値を日付形式でフォーマットしたいのですが、単純に、次のFROM_UNIXTIMEように外部のタイムスタンプをフォーマットできます。

SELECT 
    a.id_workorder, 
    FROM_UNIXTIME(MAX(b.update_date)) AS udpate_date
FROM main_log a, 
(
    SELECT MAX(log_date) AS update_date, log_id 
    FROM log_a
    GROUP BY log_id
    UNION
    SELECT MAX(log_date) AS update_date, log_id 
    FROM log_b
    GROUP BY log_id
)b
WHERE a.id_log = b.log_id
GROUP BY b.log_id

しかし、それは与えます

id          last update
-------------------------
1001        null
1002        null
1003        null
1004        null
1005        null
...

内部クエリにも変換を入れようとしましたが、同じです。

また、SO、mySQL ドキュメント、および Google で回答を見つけようとしましたが、group by.

4

2 に答える 2

26

タイムスタンプはミリ秒単位です。試してみてください:

SELECT a.id_workorder, 
FROM_UNIXTIME(MAX(b.update_date/1000)) AS udpate_date
FROM main_log a, ...

(つまり、時間を 1000 で割って秒を取得します)

mysql> select FROM_UNIXTIME(1376750476349);
+------------------------------+
| FROM_UNIXTIME(1376750476349) |
+------------------------------+
| NULL                         |
+------------------------------+
1 row in set (0.06 sec)

mysql> select FROM_UNIXTIME(1376750476349/1000);
+-----------------------------------+
| FROM_UNIXTIME(1376750476349/1000) |
+-----------------------------------+
| 2013-08-17 15:41:16               |
+-----------------------------------+
1 row in set (0.02 sec)

mysql>
于 2013-10-25T08:53:11.240 に答える