我正在努力做一件事。我试图通过使用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
,然后运行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;
答案 0 :(得分:2)
你应该改变你的表来清理数据。将数据转换为两列,时区信息在一列中,日期和时间在另一列中。 您可以使用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等。
答案 1 :(得分:0)
您可以使用to_days()或datediff()函数
http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html