簡體   English   中英

SQL-自日期起的時間

[英]SQL - Time since date

我為一件事而苦苦掙扎。 我試圖通過使用SQL計算某個日期是多少天前。 我在數據庫中擁有的日期可以采用兩種格式:

Aug 28 2014, 17:17:34 CEST
Dec 29 2015, 01:03:14 CET

那是兩個不同日期的例子。 注意“ CET”和“ CEST”。

但是無論如何,我將如何在SQL查詢中進行計算呢? 我設法在PHP中做到這一點,但我想在SQL查詢本身中做到這一點(如果可能的話)。 因為這樣可以節省大量的內存使用量。 我嘗試使我的工作盡可能快。 我只想訪問過去2-3天左右才登錄的用戶的數據。 當然,我可以對SELECT * FROM users進行SELECT * FROM users ,然后運行PHP來檢查日期。 但是,也許有一種方法可以在SQL中做到這一點? 贊: SELECT * FROM users WHERE [lastlogin < 2 days]

這是我當前的PHP代碼。 我真的很想用SQL做到這一點。 順便說一句,我的專欄目前是文字。 由於某種原因,日期時間無法使用該格式。

$lastlogin = $row['lastlogin'];
$lastlogin = str_replace("\xc2\xa0",' ',$lastlogin);

$Date = $lastlogin;
$Date = substr($Date, 0, strpos($Date, " CE"));
$now  = date('Y-m-d');
$datetime1 = new DateTime($Date);
$datetime2 = new DateTime($now);
$interval = $datetime1->diff($datetime2);
$difference = $interval->format('%a days ago');

echo "Last login was: " . $difference;

您應該更改表以清理數據。 將數據轉換為兩列,其中一列為時區信息,另一列為日期和時間。 您可以使用SUBSTRING_INDEX()輕松拆分數據,並將字符串同時轉換為日期時間。

像這樣在“ CET”和“ CEST”的“ C”上進行拆分:

SELECT SUBSTRING_INDEX("Aug 28 2014, 17:17:34 CEST","C",1)

並且您會看到只剩下日期和時間部分,盡管仍然是字符串格式。 可以使用STR_TO_DATE進行更改,並且您可以同時進行兩種操作。

首先添加新列以存儲數據:

ALTER yourtablename ADD newdatecolumn DATETIME AFTER oldcolumnname;
ALTER yourtablename ADD newtimezonecolumn VARCHAR(4) AFTER newdatecolumn;

UPDATE yourtablename
SET newdatecolumn = 
STR_TO_DATE(SUBSTRING_INDEX(olddatecolumn,"C",1), '%b %d %Y, %T')

然后,您可以再次使用SUBSTRING_INEX,這次在列的最后一個空格上進行划分,並為另一個新列獲取時區

UPDATE yourtablename
SET newtimezonecolumn = SUBSTRING_INDEX(olddatecolumn," ",-1)

那么您將擁有可以輕松使用建議DATEDIFF()或其他時間和日期函數的數據。 如果需要,可以刪除舊的日期列。

請注意,應將yourtablename等更改為實際的表名和列名。

您可以使用to_days()或datediff()函數
http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM