2014-06-17 228 views
10

我在這裏閱讀了一些帖子,似乎沒有什麼特別的,但我仍然無法選擇最後幾天的條目。MySQL選擇最近7天

SELECT 
    p1.kArtikel, 
    p1.cName, 
    p1.cKurzBeschreibung, 
    p1.dLetzteAktualisierung, 
    p1.dErstellt, 
    p1.cSeo, 
    p2.kartikelpict, 
    p2.nNr, 
    p2.cPfad 

FROM 
    tartikel AS p1 WHERE DATE(dErstellt) > (NOW() - INTERVAL 7 DAY) 

INNER JOIN 
    tartikelpict AS p2 
    ON (p1.kArtikel = p2.kArtikel) WHERE (p2.nNr = 1) 

ORDER BY 
    p1.kArtikel DESC 

LIMIT 
    100;', $connection); 

如果我今天和最近7天之間添加我的代碼將不會輸出任何內容。

+0

那就是我讀過的文章,並在我的代碼中使用 – karadayi

+0

你不想要'不要解釋你得到了什麼錯誤,或者說這不起作用。除非這個問題得到改善,否則將會關閉一個重複的問題。 –

+0

我沒有得到任何輸出(沒有錯誤,沒有結果)如果我用'DATE(dErstellt)>(NOW() - INTERVAL 7 DAY)' – karadayi

回答

37

WHERE條款是錯誤的,它必須遵循表引用和JOIN操作。

事情是這樣的:

FROM tartikel p1 
JOIN tartikelpict p2 
    ON p1.kArtikel = p2.kArtikel 
    AND p2.nNr = 1 
WHERE p1.dErstellt >= DATE(NOW()) - INTERVAL 7 DAY 
ORDER BY p1.kArtikel DESC 

編輯(三加年後)

以上基本上回答了這個問題:「我想一個WHERE子句添加到我的查詢和現在該查詢返回一個錯誤,我該如何解決它?「

至於有關書面檢查的「過去7天」的日期範圍條件下,問題...

這真的取決於解釋說明,表中的列的數據類型是什麼(DATE或DATETIME)以及可用的數據......應該返回的內容。總結:一般的方法是爲日期/日期時間範圍和該範圍的「結束」標識「開始」,並在查詢中引用它們。讓我們考慮一些更簡單的...所有行爲「昨天」。

如果我們的列是DATE類型的。在我們將一個表達式併入查詢之前,我們可以用一個簡單的SELECT

SELECT DATE(NOW()) + INTERVAL -1 DAY 

進行測試,並驗證返回的結果是我們所期望的。然後,我們可以使用相同的表達在WHERE子句,比較它與DATE列是這樣的:

WHERE datecol = DATE(NOW()) + INTERVAL -1 DAY 

對於DATETIME或TIMESTAMP列,我們可以使用>=<不等式比較,以指定一個範圍

WHERE datetimecol >= DATE(NOW()) + INTERVAL -1 DAY 
    AND datetimecol < DATE(NOW()) + INTERVAL 0 DAY 

對於「過去7天」,我們需要知道從現在起7天以後的這個意思......例如在過去的7 * 24小時,包括在比較的時候分量,...

WHERE datetimecol >= NOW() + INTERVAL -7 DAY 
    AND datetimecol < NOW() + INTERVAL 0 DAY 

在過去7個完整的天,不包括

WHERE datetimecol >= DATE(NOW()) + INTERVAL -7 DAY 
    AND datetimecol < DATE(NOW()) + INTERVAL 0 DAY 

或過去的六年完成日,加今天到目前爲止今天...

WHERE datetimecol >= DATE(NOW()) + INTERVAL -6 DAY 
    AND datetimecol < NOW()  + INTERVAL 0 DAY 

我建議測試在右側的表達式,在SELECT語句中,我們可以代替使用用戶定義的變量NOW()進行測試,而不是被捆綁到什麼NOW()返回,所以我們可以測試邊界,跨越周/月/年邊界等等。

SET @clock = '2017-11-17 11:47:47' ; 

SELECT DATE(@clock) 
    , DATE(@clock) + INTERVAL -7 DAY 
    , @clock + INTERVAL -6 DAY 

一旦我們有返回的工作價值觀的表達「開始」和「結束」爲我們的具體使用情況,就是我們所說的「過去7天」,我們可以使用這些表達在範圍比較WHERE子句。

(有些開發人員喜歡使用DATE_ADDDATE_SUB職能到位+ INTERVAL val DAY/HOUR/MINUTE/MONTH/YEAR語法。

和MySQL提供了一些方便的功能與DATE,DATETIME和TIMESTAMP數據類型的... DATE工作,LAST_DAY,

有些人希望能夠計算在SQL查詢的開始和其他代碼結束,供應字符串字面量,使得提交給數據庫的查詢是

WHERE datetimecol >= '2017-11-10 00:00' 
    AND datetimecol < '2017-11-17 00:00' 

而且這種方法也適用。 (我更傾向於將那些字符串文字明確投進去DATETIME,無論是與CAST,轉換或只是+間隔招...

WHERE datetimecol >= '2017-11-10 00:00' + INTERVAL 0 SECOND 
    AND datetimecol < '2017-11-17 00:00' + INTERVAL 0 SECOND 

上述所有假設我們現在存儲「日期」,在適當的DATE,DATETIME和/或TIMESTAMP數據類型,並且不將它們以各種格式(例如'dd/mm/yyyy',m/d/yyyy,朱利安日期)或以零星非規範格式存儲爲字符串,或者作爲從該紀元開始以來的秒數,這個答案需要更長的時間

+0

'添加行,我從來不知道INTERVAL命令。非常酷的工具添加到工具箱。謝謝 ! – CTala

+0

@JunedAnsari:'dtcol> = DATE(NOW())+ INTERVAL -7天和dtcol spencer7593

+0

@JunedAnsari:擴展答案包括討論「過去7天」的可能解釋,以及對各種日期/日期時間範圍寫入條件的方法進行一般性討論 – spencer7593

4

由於您使用的是INNER JOIN你可以把條件在WHERE子句中,像這樣的:

SELECT 
    p1.kArtikel, 
    p1.cName, 
    p1.cKurzBeschreibung, 
    p1.dLetzteAktualisierung, 
    p1.dErstellt, 
    p1.cSeo, 
    p2.kartikelpict, 
    p2.nNr, 
    p2.cPfad 
FROM 
    tartikel AS p1 INNER JOIN tartikelpict AS p2 
    ON p1.kArtikel = p2.kArtikel 
WHERE 
    DATE(dErstellt) > (NOW() - INTERVAL 7 DAY) 
    AND p2.nNr = 1 
ORDER BY 
    p1.kArtikel DESC 
LIMIT 
    100;