2015-08-22 69 views
0

如何聲明SET @unix_four_weeks_ago = UNIX_TIMESTAMP(curdate()) - 2419200;在PHP文件中。@SET(SQL)in PHP

SQL

SET @unix_four_weeks_ago = UNIX_TIMESTAMP(curdate()) - 2419200; 
SELECT id FROM USERS WHERE timemodified >= @unix_four_weeks_ago; 

PHP

$result=$mysqli->query("SET @unix_four_weeks_ago = UNIX_TIMESTAMP(curdate()) - 2419200;SELECT id FROM USERS WHERE timemodified >= @unix_four_weeks_ago; "); 

查詢是所有有關獲取最後4週記錄。查詢在SQL中正常工作,但是當我運行php文件時沒有給出任何輸出。

回答

0

正如其他人所說的,multi_query將允許您一次運行多個語句。然而,這個查詢是相當複雜的,很難閱讀,你至少必須記錄神奇數字2419200的含義。此外,由於DST考慮,此查詢對於包含DST切換事件的時間段不完全正確。您也可以將此查詢轉換爲

SELECT id from users where timemodified >= UNIX_TIMESTAMP(SUBDATE(curdate(), 28)) 

這是一個更具可讀性,並且使用適當的日期時間計算更正確。

+0

fvu-查詢工作正常,但是您是如何得到的28.您能否解釋我 –

+0

四周是28天,SUBDATE [需要幾天或INTERVAL規範](https://dev.mysql.com/ doc/refman/5.5/en/date-and-time-functions.html#function_subdate)作爲第二個參數 - 我可以寫'SUBDATE(curdate(),INTERVAL 28 day)'得到相同的結果。 – fvu

0

mysqli_query()只允許一條語句。雖然你可以使用mysqli_multi_query(),你也可以重寫查詢爲:

SELECT id 
FROM (SELECT @unix_four_weeks_ago := UNIX_TIMESTAMP(curdate()) - 2419200 
    ) params CROSS JOIN 
    USERS 
WHERE timemodified >= @unix_four_weeks_ago; 

這使您可以直接在聲明中設置的值。

+0

Gordon Linoff - params表示什麼。你能用一個例子來闡述你的答案嗎? –

+0

@CoreenStupka。 。 。它只是一個用於初始化變量的子查詢。 MySQL首先處理'FROM',所以這是安全的。 –