2014-03-28 47 views
0

錯誤的答案這裏是我的表掌握MySQL的日期查詢

enter image description here

我執行,給我造成其item_valid_from必須比今天的dateitem_valid_to更大必須小於今天字段的查詢。

我的查詢是

select * 
    from tbl1 
where item_valid_from >= CurDate() 
     and item_valid_to < CurDate() 

任何解決方案?

+0

如果將存儲日期YYYY-MM-DD在' DATE'字段,你不會有任何問題... –

+0

你的意思是我必須修改我的表格結構嗎? –

+1

@sourabhkasliwal:如果你能做到這一點,請做到這一點.... –

回答

1

我勸你改變item_valid_*領域格式DATE場格式。你將在未來爲你節省很多麻煩。

但是沒關係,如果你不想這樣做,那麼你可以使用STR_TO_DATE()功能:

SELECT * 
FROM `table` 
WHERE CURDATE() BETWEEN STR_TO_DATE(`from_field`, '%d-%m-%Y') AND STR_TO_DATE(`to_field`, '%d-%m-%Y') 

demo

+0

如果我從varchar字段更改爲日期比正常查詢將工作 –

+0

是的,那麼簡單地與'CURDATE()'比較就可以工作。但在更改字段格式之前,您需要將當前數據更改爲「YYYY-MM-DD」格式。 –

0

假設數據類型item_valid_fromitem_valid_to是DATE,TIMESTAMP等,那麼你有你的操作員倒退。把時間想象成1970年以來的秒數,因爲這是它在unix時間的存儲方式。這意味着item_valid_from將比item_valid_to小,並且您希望在今天介於兩者之間時顯示它。您希望item_valid_from小於或等於現在,並且item_valid_to比現在更大(而不是過去)。

SELECT * 
FROM tbl1 
WHERE item_valid_from <= CURDATE() AND item_valid_to > CURDATE() 

看到這個SQL Fiddle爲例,只有2-4是有效的,在結果在過去的日期是有效起至在將來的日期顯示。

+0

'CURDATE'正在返回'YYYY-MM-DD'格式。那麼如何將'DD-MM-YYYY'與'CURDATE()'進行比較呢? –

+0

它們是日期,而不是字符串,所以即使它們的格式如此,仍然可以將它們作爲日期進行比較。使用CURRENT_TIMESTAMP可能更合適,請查看我的Sql Fiddle示例。 – doublesharp

+0

鏈接在哪裏? –

-1

你必須使用下面的查詢其改變當前的日期格式,然後比較日期和取結果:

SELECT * 
FROM tbl1 
WHERE date_format(item_valid_from,'%d-%m-%Y') >= date_format(CurDate(),'%d-%m-%Y') 
AND date_format(item_valid_to,'%d-%m-%Y') < date_format(CurDate(),'%d-%m-%Y') 

請檢查:http://sqlfiddle.com/#!2/561d0/2

+0

我的字段日期格式是在dd-mm-YYYY,它不工作... –

+0

我已更新我的答案。你只是在當前日期改變日期 –

+0

它不工作你的解決方案是錯誤的,它只檢查它是不是在月份和年份字段工作,如果我使日期爲29-04-2014它工作,但對於04-04 -2014它不起作用 –