收到此查詢以下錯誤消息,當我在最後選擇添加算術......這是一個非常簡單的計算所以不知道是什麼問題:算術mysql的select語句 - 內存大小錯誤
alert.last_email is a utc timestamp (unsigned integer)
alerts.email_rate is value in minutes (unsigned integer)
這是一個消息隊列...我試圖讓sends_in
成爲一個秒數的消息將發送。
例如使用正常時間而不是時間戳...在晚上7點發送的最後一封電子郵件,費率爲15分鐘,所以它將在7:15發送。如果當前時間是7:10,那麼發送時間是5分鐘或者300秒。
Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 505364672 bytes) in Unknown on line 0
$stmt = $db->prepare("
SELECT
users.username AS username,
computers.computer_name AS computer_name,
alerts.last_email AS last_email,
alerts_queue.alert_id AS alert_id,
alerts_queue.event_title AS event_title,
alerts_queue.event_target AS event_target,
alerts_queue.capture_timestamp AS capture_timestamp,
alerts.last_email + (alerts.email_rate * 60) - UNIX_TIMESTAMP() AS sends_in
FROM computers
INNER JOIN users
ON users.computer_id = computers.computer_id
INNER JOIN alerts
ON alerts.user_id = users.user_id
INNER JOIN alerts_queue
ON alerts_queue.user_id = alerts.user_id
WHERE computers.account_id = :cw_account_id AND computers.status = :cw_status
");
$binding = array(
'cw_account_id' => $_SESSION['user']['account_id'],
'cw_status' => 1
);
$stmt->execute($binding);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
UPDATE:
計算不按預期工作:
TIMESTAMPDIFF(SECOND, UTC_TIMESTAMP(), FROM_UNIXTIME(UNIX_TIMESTAMP() + alerts.email_rate * 60)) AS sends_in
使用這個作爲測試...的差額爲900秒,但它返回-13500。
TIMESTAMPDIFF(SECOND, UTC_TIMESTAMP(), FROM_UNIXTIME(UNIX_TIMESTAMP() + 15 * 60)) AS sends_in
UPDATE:我的一部分
錯誤 - 這將返回正確的值:
TIMESTAMPDIFF(SECOND, NOW(), FROM_UNIXTIME(UNIX_TIMESTAMP() + 15 * 60)) AS sends_in
工作液:
它看起來有點邋遢,但是這作品。 TIMESTAMPDIFF使用當前時區...我的last_email
值是一個unix時間戳,這是FROM_UNIXTIME進場的地方。因爲last_email
是一個無符號整數,除非將其轉換爲有符號整數,否則算術將無法正常工作。我總是把我的時間戳設置爲無符號的原因是因爲永遠不會有負面的,但是在使用MySQL進行算術的情況下,這會造成問題。
TIMESTAMPDIFF(SECOND, NOW(), FROM_UNIXTIME(CONVERT(alerts.last_email,SIGNED) + alerts.email_rate * 60)) AS sends_in
這不是一個mysql錯誤。您可能會返回過多的數據行,導致內存過載。 – Robbert 2014-09-22 21:16:28
在這個測試中,只有兩行數據......沒有最後一次選擇與數學有關的情況下工作得很好。 – user756659 2014-09-22 21:17:18
您是否嘗試過使用MySQL的內置函數? 'TIMESTAMPDIFF(SECOND,FROM_UNIXTIME(alerts.last_email + alerts.email_rate * 60),NOW())AS sending_in'或類似的東西?理想情況下,時間將存儲爲一個DATETIME而不是一個INT ... – miken32 2014-09-22 21:32:15