MySQL从今天开始选择*

时间:2018-05-25 13:06:13

标签: mysql date mysql-workbench

我正在运行一个简单的代码来检查ping并从SQL获取IP地址。

我希望代码只针对我今天没有看到的代码运行,所以每次运行它都会从列表中删除他已经得到答案的IP地址,但MySQL命令对我不起作用。

这是我找到的命令:

select
IP
From 
database.devices
where DATE(LastConnected) != Date((now))

我在数据库中保存的数据使用以下格式:

25-may-18 14:30:21
dd-mm-yy hh:mm:ss

有什么问题?也许我只需要约会? 18年5月25日?如果是这样 - 我该怎么做?

2 个答案:

答案 0 :(得分:0)

scala> val resultSet = List(1,2,3,4).permutations.map(x => x.sliding(2,2).toSet).flatten.map(z => z.sorted).toSet.toList
resultSet: List[List[Int]] = List(List(3, 4), List(1, 2), List(2, 3), List(1, 4), List(2, 4), List(1, 3))

scala> resultSet.reverse.sliding(2,2).toList
res1: List[List[List[Int]]] = List(List(List(1, 3), List(2, 4)), List(List(1, 4), List(2, 3)), List(List(1, 2), List(3, 4)))

答案 1 :(得分:0)

使用此格式”使得它听起来像我们将日期时间值存储为字符串类型(例如VARCHAR)而不是使用MySQL DATETIME数据类型,这是专门设计为存储日期时间值。 (但也许我正在阅读“使用这种格式”和奇怪的dd-Monthname-two_digit_year,而不是保证。)

如果我们想使用MySQL日期/日期时间操作,我们可以使用DATETIME函数将字符串值转换为实际的STR_TO_DATE数据表。

我们可以在选择列表中测试表达式,这样我们就能看到实际发生的事情......

SELECT d.lastconnected
     , STR_TO_DATE(d.lastconnected,'%d-%b-%y %T') AS lc_datetime_
     , DATE(NOW())
     , DATE(NOW()) + INTERVAL 1 DAY
FROM database.devices

一旦我们测试了表达式,我们就可以在WHERE子句中使用它们

要返回具有最后连接字符串的行,该字符串表示当天“当天”的日期时间,我们可以执行以下操作:

SELECT d.lastconnected
     , STR_TO_DATE(d.lastconnected,'%d-%b-%y %T') AS lc_datetime_
     , ... 
  FROM database.devices d
 WHERE STR_TO_DATE(d.lastconnected,'%d-%b-%y %T') >= DATE(NOW()) + INTERVAL 0 DAY
   AND STR_TO_DATE(d.lastconnected,'%d-%b-%y %T')  < DATE(NOW()) + INTERVAL 1 DAY

如果dt_lastconnectedDATETIME列,我们的查询可以对以dt_lastconnected作为前导列的索引使用有效的范围扫描操作:

SELECT ... 
  FROM database.devices d
 WHERE d.dt_lastconnected  >= DATE(NOW()) + INTERVAL 0 DAY
   AND d.dt_lastconnected   < DATE(NOW()) + INTERVAL 1 DAY

问:如果我在表格上更改了...... [最后连接列]的数据类型 - 数据会发生什么?我需要重新进入吗?或者它会单独改变它?

为了避免“擦除”最后连接列的内容,我们可以添加另一个相应类型的列,并设置现有列的值。

如果表格是一组合理大小的行,我们可以

ALTER TABLE database.device ADD dt_lastconnected DATETIME
;

UPDATE database.device
   SET dt_lastconnected = STR_TO_DATE(d.lastconnected,'%d-%b-%y %T')
;

这将转换它可以的任何值。具有lastconnected值且无法解析为有效日期时间的行将dt_lastconnected设置为NULL。

如果我们想在INSERT语句中填充新列,我们需要以适当的格式提供值,YYYY-MM-DD HH:MI:SS例如。

INSERT INTO databases.device ( ... , dt_lastconnected , ... ) VALUES
  ( ... , '2018-05-25 18:35:15' , ... )
, ( ... , STR_TO_DATE('25-May-2018 18:35:15','%d-%b-%y %T') , ... )
, ( ... , NOW() , ... )

一旦我们更正了INSERT代码,我们就可以删除字符串列,并重命名新列。 (如果lastconnected是索引中的列,则会更复杂。)

-- remove old column
ALTER TABLE databases.devices
  DROP lastconnected ;

-- rename column
ALTER TABLE databases.devices
  CHANGE dt_lastconnected lastconnected DATETIME ;