2017-10-21 33 views
-3

我想運行說找到不包含01:在過去7天的設備。 我試過「Where列'不喜歡'%01:%'」但它只是刪除了01:並且仍然顯示過去7天有01:的機器。SQL Like Search

我有一個表稱爲設備。每個位置都有一個唯一的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:%' 

開始我得到的結果是,沒有在01:00 3天前運行的機器。工作日期顯示19:00,因此它聽起來像是剛剛刪除了01 :.

我在考慮將工作數據分組,然後說列出沒有的電腦2017-10-23 01:00:02。

+2

請澄清你的問題,真的很難理解你想要什麼。請閱讀:https://stackoverflow.com/help/mcve –

+0

我刪除了不兼容的數據庫標記。請僅使用您真正使用的數據庫進行標記。樣本數據和期望的結果真的有幫助。 –

+0

要麼你有'mysql'或'sql-server'。你的表格列是如何聲明的。請向我們展示相應的CREATE TABLE語句,一些示例數據和預期結果。 –

回答

0

下面的建議有很多直覺,後面會有更多的直覺。

大多數數據庫並不實際存儲日期/時間信息是一種所見即所得的方式。事實上,如果你足夠長的時間思考,你會明白日期/時間確實是「數字集」。因此,如果數據存儲爲datetime data type而不是嘗試對日期時間列使用LIKE(這是用於文本的)。因此,如果計算從date1到date2的天數等等。而應尋找可能適用於您的情況的與日期和時間相關的功能。在這裏,你正在尋找不等於一天的具體時間(我認爲)。所以,從考慮中刪除「日期」將其轉換爲「時間」,然後您可以過濾。

下面我介紹一個新的列jobtime,它是jobdate的時間部分,然後我查找任何不等於給定值的時間。

SQL Fiddle

的MySQL 5.6架構設置

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') 
; 

查詢1

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

Results

| locationid | jobtime |    jobdate | 
|------------|----------|----------------------| 
|   ## | 19:00:02 | 2017-10-23T19:00:02Z | 

...


爲什麼會出現 「直覺」 上面?(「稍後更多」)

由於供應商之間的語法差異太大,因此不知道使用哪個數據庫非常令人沮喪。知道jobdate columnEXACTdata type也很重要 - 因爲如果它是varchar,例如我剛纔在上面的查詢中做了一個完整的傻瓜。換句話說,我們不可能回答,因爲缺少關鍵事實。

最後,你有數據!它已經在你的桌子上了。爲什麼不通過分享一些數據讓每個人都輕鬆?爲您的問題提供「樣本數據」,並提供「預期結果」(即提供2件事,而不是一件沒有另一件,並且不使用數據圖像 !!!)。希望你可以從上面的例子中看到樣本數據&結果是多麼有用。例如,如果我的直覺離開了,即使你沒有閱讀SQL,你也可以馬上知道它是什麼。

饒過了,並非所有這裏提出的問題都適用於這個問題。