2011-04-02 69 views
2

我在查詢數據庫以獲取某年的某個月的所有博客文章。日期存儲在數據庫中YYYY-MM-DD日期的SQL like子句

什麼是最好的萬無一失的方法只獲得某一天和某一年的職位?我試圖鏈接條款一樣,但我已經認識到它們會失敗的一些方法,例如,如果我使用了語句:

'SELECT * FROM entries WHERE date LIKE \''.$year.'%\' AND date LIKE \'%'.$month_no.'%\'' 

這將失敗,如果當月數正好是包含在年份編號的最後3位數字。我是否必須使用正則表達式,如果是這樣,有人可以提出我可以使用的聲明嗎?

+1

當詢問SQL或數據庫問題時,請告訴我們*您正在使用哪個數據庫*。它讓我們這些回答問題的人更容易生活。 – APC 2011-04-02 11:18:15

回答

2

我建議用datetime創建另一列(或者如果可能的話,只是日期)。今後要容易得多。

或者,您可以將其轉換爲日期類型並進行查詢。

2

我還以爲下面應該解決這個問題:

'SELECT * FROM entries WHERE date LIKE \''.$year.'-'.$month_no.'-%\'' 

但是,你需要確保$year是四位長,$month_no是兩位數字的任何腳本語言等你」重新創建查詢。

+0

謝謝,我試過了,它沒有工作,我認爲這一定是因爲該字段是日期類型,因爲m.genova在 – Inigo 2011-04-02 11:18:21

1

如果DATE字段是DATE TYPE,那麼'like'操作符不起作用,您必須在varchar類型中轉換日期類型,然後您可以對trasformation的結果使用'like'運算符。

再見

+0

以下說的啊,我明白了。非常感謝 – Inigo 2011-04-02 11:16:24

1

我就遇到了這個時候我做了監控事件的數據庫(礦是由事實的我在做什麼方面,我的日子其實從早8點在早上跑複雜,所以01/02/2011 07:59:59「實際上會算作1月1日!,你可以做很多事情

你是在某一天之後,你沒有提到你從哪種語言調用SQL。

  1. 將日期存儲爲日期時間,然後使用convert轉換爲con將其轉換爲日期,您可以查詢爲正常日期(請參閱轉換爲會話)

  2. 存儲日期如上,並在之間使用,所以$ date1 = 01/01/2001 00:00:00和$ DATE2 = 2月1日/ 2011〇點00分00秒將

    'select * from entries where date between "'.$date1.'" and "'.$date2.'"' 
    
  3. 跟着你有什麼和做什麼

    'select * from entries where date = "'.$year.'/'.$month.'/'.$day.'"' 
    

但至少有完整的日期和時間,用戶可以仍按時間順序排列。

1

你不說你正在使用的數據庫的味道。大多數產品都支持DATE數據類型,這將是該列的明顯選擇。

但你實際使用的字符列,那麼你可以很容易地通過使用substring()substr()功能,可以解決它沒有正則表達式的假設:

'SELECT * FROM entries 
WHERE substr(date, 1, 7) = '.$year.'-'.$month_no 

NB對不起,我不認識你的SQL方言,所以我可能有錯誤的確切的語法。

4

請..只是使用日期過濾器。這將有助於性能(使用索引)

$query = "SELECT * 
FROM entries 
WHERE date >= '" . $year . "-" . $month_no . "-01' 
    AND date < adddate('" . $year . "-" . $month_no . "-01', interval 1 month)"; 

這是針對MySQL的。對於SQL Server,使用類似的東西,但使用DATEADD代替

... 
WHERE date >= '$year" . $month . "01' 
    AND date < DATEADD(month,1,'$year" . $month . "01'"; 

之所以增加一個月的,這是比較容易處理的情況下每月爲12(12月)。

1

萬無一失很可能是你的字符串轉換爲日期:

DECLARE @dateToFind datetime 

SET @dateToFind = CONVERT(datetime, N'2011-04-02', 20) 

SELECT * FROM [table] WHERE CONVERT(datetime, [datefield], 20) = @dateToFind 

或者,如果你需要一個範圍:

DECLARE @startDate datetime, @endDate datetime 

SELECT 
    @startDate = CONVERT(datetime, N'2011-04-01', 20), 
    @endDate = CONVERT(datetime, N'2011-04-30', 20) 

SELECT * FROM [table] WHERE CONVERT(datetime, [datefield], 20) BETWEEN @startDate AND @endDate 

或者你可以兩次轉換:

SELECT * FROM [table] WHERE YEAR(CONVERT(datetime, [datefield], 20)) = 2011 AND MONTH(CONVERT(datetime, [datefield], 20)) = 4 

CONVERT中的數字20與您的日期格式相匹配。