SQL喜欢搜索

时间:2017-10-21 14:37:24

标签: mysql sql

我试图在过去7天内找到不包含01的设备: 我已经尝试过“Where column Not'%01:%'”,但它只删除01:并且仍显示过去7天内具有01:的机器。

我有一个名为devices的表。每个位置都有一个唯一的ID号。每个设备在凌晨1点和7点运行工作。设备应该每周01:00:00有1个条目,然后每周19:00:00有3个条目。细胞数据的例外是2017-10-23 19:00:02。

所以我从

开始
Select * From devices 
Where locationid=## 
AND jobdate  < DATE_SUB(NOW(), INTERVAL 7 DAY)) 
AND jobdate not like '%01:%'

我得到的结果是2天前01:00运行的机器。作业日期显示为19:00所以听起来它只是删除了01:。

我正在考虑对作业数据进行分组,然后列出没有2017-10-23 01:00:02的计算机。

1 个答案:

答案 0 :(得分:0)

以下建议有很多直觉,后面会有更多的直觉。

大多数数据库实际上不存储日期/时间信息是一种所见即所得的方式。事实上,如果你仔细考虑它,你会明白日期/时间确实是&#34;数字和#34;。这就是为什么我们可以做一些事情,比如计算从date1到date2的天数等等。所以,如果数据存储为datetime data type 不要尝试使用{{针对日期时间列的1}}(用于文本)。而是查找可能适用于您的情况的日期和时间相关功能。在这里,您正在寻找不等于一天中的特定时间(我认为)。所以,删除&#34; date&#34;从考虑转换为&#34;时间&#34;,然后你可以过滤它。

下面,我介绍一个新列LIKE,它是jobtime的时间部分,然后我查找任何不等于给定值的列。

SQL Fiddle

MySQL 5.6架构设置

jobdate

查询1

CREATE TABLE Devices 
    (`locationid` varchar(2), `jobdate` datetime)
;

INSERT INTO Devices 
    (`locationid`, `jobdate`)
VALUES
    ('##', '2017-10-23 01:00:00'),
    ('##', '2017-10-23 19:00:02')
;

<强> Results

select
*
from (
  select locationid, cast(jobdate as time) jobtime, jobdate
  from devices
  ) d
where locationid = '##'
and jobtime <> '01:00:00'
;

...

为什么会出现直觉&#34;以上?(&#34;以后更多&#34;)

不知道哪个数据库正在使用是非常令人沮丧的,因为供应商之间的语法差异很大。了解| locationid | jobtime | jobdate | |------------|----------|----------------------| | ## | 19:00:02 | 2017-10-23T19:00:02Z | EXACT data type也很重要 - 因为如果它是varchar,例如我在上面的查询中完全愚弄了自己。换句话说,我们不太可能回答,因为缺少关键事实。

最后,你有数据!它已经在你的桌子上了。为什么不通过共享它来让每个人都轻松一点?提供&#34;样本数据&#34;与您的问题,以及&#34;期望的结果&#34;也是(即提供两件事,而不是另一件事,并且不使用数据图像 !!!)。希望您可以从上面的示例中看到有用的示例数据和数据。结果是。例如,如果我的直觉偏离了,你可以瞬间告诉它 - 即使你没有读过SQL。

Rant over,并非此处提出的所有观点都适用于此问题。