2009-10-09 828 views
32

你能幫我解決這個問題嗎?我試圖按日期排序SQL查詢的結果,但我沒有得到我需要的結果。SQL ORDER BY日期問題

我使用的查詢是:

SELECT date FROM tbemp ORDER BY date ASC 

結果是:

01/02/2009 
03/01/2009 
04/06/2009 
05/03/2009 
06/12/2008 
07/02/2009 

結果應該是:

06/12/2008 
03/01/2009 
01/02/2009 
07/02/2009 

我需要的格式來選擇上述日期。

非常感謝您的幫助。

+5

當您發佈問題,這一點很重要提供具體信息,例如您正在使用的數據庫以及DATE列在您的表中的數據類型。它讓人們試圖幫助你更容易;他們不必猜測。 –

+5

雖然我知道它不是真正必要的答案,我很樂意聽到一個好的理由,爲什麼該列不是日期時間... – Achilles

+2

ORDER BY ID(自動遞增值) – tetris

回答

14

這聽起來像你的專欄不是一個日期列,而是一個文本列(varchar/nvarchar等)。您應該將其作爲日期存儲在數據庫中,而不是字符串。

如果您的已將以某種原因存儲爲字符串,請以可排序格式將其存儲,例如, YYYY/MM/DD。

正如najmeddine所示,您可以轉換爲每次訪問時的列,但我會盡力不這樣做。它會使數據庫做更多的工作 - 它將無法保留適當的索引等。儘可能將數據存儲在適合數據本身的類型中。

+0

或yyyy-mm-dd更好 – dusoft

+2

@dusoft:只要符合正確的重要性順序,使用哪個分隔符並不重要。 –

+0

@Jon:比較兩個連字符比兩個斜線更容易,因爲您不必處理角度。 :-D – Zed

37

看來你的日期列不是datetime類型,而是varchar。你必須把它轉換成datetime排序時:

select date 
from tbemp 
order by convert(datetime, date, 103) ASC 

style 103 = dd/MM/yyyy (msdn)

+2

如果當前的語言和日期格式設置導致將aa/bb/cccc解釋爲月/日/年,則這將無法正確排序,這與大多數美國SQL Server安裝的情況相同。 (我使用CONVERT假設這是T-SQL,因此您可以指定樣式103作爲CONVERT的可選第三個參數並覆蓋任何語言或dateformat上下文。) –

+0

感謝您的信息。 – manji

+0

我很想知道任何人都可以從提供的信息中發現這些日期不是'datetime',而是'varchar'。爲什麼只有通過改變字段類型才能獲得比最初顯示的結果更少的結果?不應該需要一個'WHERE'子句來減少返回的答案,如果它給出了所有的結果,它應該只給出其中的一部分結果? – vapcguy

3

以下的答案可以幫助你

您的日期標識在SELECT子句中執行您的日期順序,但使用TO_CHAR()函數並在日期的select子句中使用其他標識符

例如

SELECT TO_CHAR(DISPDATE1,'DD/MM/YYYY') AS DISPDATE, 
SUM(APPLCOUNT) AS APPLIED, 
SUM(CONFCOUNT) AS CONFIRMED 
FROM 
    (
     SELECT COUNT(ID) AS APPLCOUNT, 
        0 AS CONFCOUNT, 
        STUDENT.APPLIED_ON AS DISPDATE1 
      FROM STUDENT 
      WHERE STUDENT.ID = P_ID 
      GROUP BY STUDENT.APPLIED_ON 
     UNION 
      SELECT 0 AS APPLCOUNT, 
        COUNT(ID) AS CONFCOUNT, 
        STUDENT.CONFIRMED_ON AS DISPDATE1 
      FROM STUDENT 
      WHERE STUDENT.ID = P_ID 
      GROUP BY STUDENT.CONFIRMED_ON 
    ) 
GROUP BY DISPDATE1 
ORDER BY DISPDATE1; 
+0

to_char和其他to_date(created_at,'dd/mm/yyyy hh24:mi:ss')作爲DISPDATE ..謝謝brushan!工作正常。 – KingRider

10

不確定你使用,但是我會做它在Microsoft SQL這樣什麼DBMS:

select  [date] 
from  tbemp 
order by cast([date] as datetime) asc 
+2

這對我有用,謝謝 – Tyler

1

這可能會幫助你在MySQL和PHP。

//your date in any format 
$date = $this->input->post('txtCouponExpiry'); 

$day = (int)substr($date, 3, 2); 
$month = (int)substr($date, 0, 2); 
$year = (int)substr($date, 7, 4); 

$unixTimestamp = mktime(0, 0, 0, $year, $day, $month); 

// insert it into database 
'date'->$unixTimestamp; 

//query for selecting order by date ASC or DESC 
select * from table order_by date asc; 
1

嘗試這種

Order by Convert(datetime,@date) desc 
3

SELECT CONVERT(CHAR(19),CAST(日期AS日期時間),101),爲[日期]
FROM tbemp ORDER BY轉換(日期時間,日期, 101)ASC

1

我想編輯後代chonologic爲了幾件大事,我只是做了一個:

select 
TO_CHAR(startdate,'YYYYMMDD') dateorder, 
TO_CHAR(startdate,'DD/MM/YYYY') startdate, 
... 
from ... 
... 
order by dateorder desc 

它適用於我。 但肯定不適合每種情況... 只希望它會幫助別人!

5

這個工作對我來說:

SELECT datefield FROM myTable ORDER BY CONVERT(DATE, datefield) ASC

2

嘗試使用這個這個工作對我來說

select * from `table_name` ORDER BY STR_TO_DATE(start_date,"%d-%m-%Y") ASC 

其中起始日期是字段名