解讀mysql時間函數sysdate()和now() NOW() www.2cto.com 返回當前日期和時間值,其格式為 'YYYY-MM-DD HH:MM:SS' 或YYYYMMDDHHMMSS , 具體格式取決於該函數是否用在字符串中或數字語境中。 mysql> SELECT NOW(); -> '1997-12-15 23:50:26' mysql> SELECT NOW() + 0; -> 19971215235026 在一個存儲程序或觸發器內, NOW() 返回一個常數時間,該常數指示了該程序或觸發語句開始執行的時間。這同SYSDATE()的運行有所不同。 SYSDATE() 返回當前日期和時間值,格式為'YYYY-MM-DD HH:MM:SS' 或YYYYMMDDHHMMSS, 具體格式根據函數是否用在字符串或數字語境而定。 在一個存儲程序或觸發器中, SYSDATE()返回其執行的時間, 而非存儲成都或觸發語句開始執行的時間。這個NOW()的運作有所不同。 我的理解: now()是應用向mysql服務器發起執行語句時(無論是發送的sql還是存儲過程的名字),now()時間已經產生。 調用在該存儲過程中或者sql中調用now(),即為調用該變量。 而sysdate()函數是每次實時去取的 在我們公司的業務中,由於禁止使用存儲過程,顯然無論使用sysdate()還是now()都能夠滿足業務需求。當然,考慮到sysdate要實時取時間,我認為now()是比較推薦的. 實踐是檢驗真理的唯一標准: 1.存儲過程: BEGIN select now(),sysdate(); select sleep(3) ; select now(),sysdate(); END 執行結果: mysql> call test; +---------------------+---------------------+ | now() | sysdate() | +---------------------+---------------------+ | 2011-01-21 11:22:58 | 2011-01-21 11:22:58 | +---------------------+---------------------+ 1 row in set (0.00 sec) +----------+ | sleep(3) | +----------+ | 0 | +----------+ 1 row in set (3.00 sec) +---------------------+---------------------+ | now() | sysdate() | +---------------------+---------------------+ | 2011-01-21 11:23:01 | 2011-01-21 11:23:01 | +---------------------+---------------------+ 1 row in set (3.01 sec) Query OK, 0 rows affected (3.01 sec) 通過如上結果來看,第一個now()跟第二個now()執行結果不一致;對存儲過程之內的now()函數,並非取自存儲過程執行的開始時間。 2.sql語句測試: mysql> select now(),sleep(3),now(); +---------------------+----------+---------------------+ | now() | sleep(3) | now() | +---------------------+----------+---------------------+ | 2011-01-21 11:25:45 | 0 | 2011-01-21 11:25:45 | +---------------------+----------+---------------------+ 1 row in set (3.00 sec) 評:now()函數,每次取語句開始的執行時間. mysql> select sysdate(),sleep(3),sysdate(); +---------------------+----------+---------------------+ | sysdate() | sleep(3) | sysdate() | +---------------------+----------+---------------------+ | 2011-01-21 11:26:44 | 0 | 2011-01-21 11:26:47 | +---------------------+----------+---------------------+ 1 row in set (3.02 sec) 評:sysdate() 每次會取實際的時間。 綜合上面的結果: 1.在公司絕大部分業務中now()函數已經夠用,特別是gmt_create,gmt_modified字段的時間,無疑要用now() 2.sysdate()用在需要每個字段執行的時候實時取時間的。 3.mysql的字段是從左到右依次執行。