2011-03-19 130 views
0

我有一個名爲date的列作爲varchar。內容格式爲「2011年3月11日」。按日期選擇sql數據順序

如何選擇結果讓它們按日期正確排序?

+1

您還需要指定DB你談論。答案將涉及使用數據庫特定的日期解析和投射功能,但如果您不幫助我們理解這些詳細信息,我們無法提供幫助。 – kvista 2011-03-19 06:03:01

+4

修復您的數據模型。永遠不要將日期存儲爲varchars。如果你使用'date'數據類型來存儲它們,你就不會有任何排序問題。 – 2011-03-19 08:12:01

+0

你可以展示一些示例數據和表結構嗎? – 2011-03-20 13:32:39

回答

3

我在這裏盲目地假設MySQL,因爲它在這個問題的背景下是有意義的。沒有人會使用其他數據庫引擎首先會創建這個問題。

STR_TO_DATE來救援!鑑於格式「2000年3月1日」,以下轉換應該工作。

SELECT STR_TO_DATE(column_name, '%M %d, %Y') 
    FROM TableName 
WHERE ... 
ORDER BY STR_TO_DATE(column_name, '%M %d, %Y') 

您可能需要稍微調整format string

1

是的,你可以使用DATE功能與CURDATE一起。

SELECT * FROM tbl WHERE DATE(your_date_column) = CURDATE() 

這將選擇所有行,其中your_date_column是今天的日期。

如果您想選擇所有行your_date_column是兩個日期之間,你可以簡單地使用BETWEEN

SELET * FROM tbl WHERE your_date_column BETWEEN '20111-03-20' AND '2011-03-30' 
+0

不,我不得不選擇兩個日期之間的行,例如: - SELECT * FROM tbl WHERE DATE(your_date_column )> = CURDATE()和DATE(your_date_column)<=其他日期 – Mohit 2011-03-20 13:36:06

+0

@Mohit查看我的更新。之間是你想要的。 – alexn 2011-03-20 13:36:54

1

如果你的兩個日期變量,比如$date_begin$date_end,你可以使用一個SQL查詢類似以下,以獲得這這些日期間的數據:

select * 
from your_table 
where date between '$date_begin' and '$date_end' 


(不知道我不太明白的問題)
如果你想獲得對應於當前日期的行,你需要的變量:

  • $current;這將是象2011-03-20 - 這意味着2011-03-20 00:00:00
  • $next;這將是像2011-03-21 - 這意味着2011-03-21 00:00:00

你會使用類似這樣的查詢:

select * 
from your_table 
where date >= '$current' and date < '$next' 

要選擇有它的日期是大於或等於今天的數據;那是在明天之前。


在任何情況下,請儘量不要在日期列中應用SQL函數;不要做這樣的事:

where some_function(date) >= ... 

這樣做,你的數據庫引擎將不得不該功能適用​​於您的表的所有行,不使用你可能對date列任何索引 - 這將導致糟糕的表演。

+0

不客氣:-)玩得開心! – 2011-03-20 13:58:56