2011-01-13 56 views
38

Điều này có vẻ ngu ngốc nhưng, tôi chỉ cần danh sách các ngày được đặt hàng với ngày gần đây nhất ở trên cùng. Sử dụng order by DESC dường như không hoạt động theo cách tôi muốn.Đặt hàng theo ngày giảm dần - tháng, ngày và năm

SELECT  * 
FROM   vw_view 
ORDER BY EventDate DESC 

Nó cho tôi ngày được sắp xếp theo tháng và ngày, nhưng không tính đến năm. ví dụ:

12/31/2009 

12/31/2008 

12/30/2009 

12/29/2009 

nhu cầu trở nên giống như hơn:

12/31/2009 

12/30/2009 

12/29/2009 

12/28/2009 

và vân vân.

+3

Kiểu dữ liệu của cột 'EventDate' là gì? –

+2

Và loại DB sẽ đẹp quá –

+2

Tại sao không cập nhật thiết kế bảng và làm cho nó chính xác, sử dụng trường ngày?! Sử dụng cách giải quyết cho một thiết kế kém không phải là một con đường tốt. –

Trả lời

53

Tôi đoán EventDate là một char hoặc varchar và không một ngày nếu không thứ tự của bạn theo mệnh đề sẽ là tốt.

Bạn có thể sử dụng CONVERT để thay đổi giá trị cho một ngày và sắp xếp theo mà

SELECT * 
FROM 
    vw_view 
ORDER BY 
    CONVERT(DateTime, EventDate,101) DESC 

Vấn đề với đó là, như Sparky chỉ ra trong các ý kiến, nếu EVENTDATE có giá trị mà không thể được chuyển đổi thành ngày truy vấn sẽ không thực thi.

Điều này có nghĩa bạn có nên loại trừ các hàng xấu hoặc để các hàng xấu đi đến dưới cùng của kết quả

Để loại trừ các hàng xấu chỉ cần thêm WHERE IsDate(EventDate) = 1

Để cho phép những ngày xấu đi đến dưới cùng bạn cần sử dụng CASE

ví dụ:

ORDER BY 
    CASE 
     WHEN IsDate(EventDate) = 1 THEN CONVERT(DateTime, EventDate,101) 
     ELSE null 
    END DESC 
+0

công trình này hoàn hảo, cảm ơn bạn! bạn đã đúng trong giả định nó là máy chủ sql và EventDate được thiết lập như là một varchar – user570457

+0

@ user570457. Không vấn đề gì. Tôi đã cập nhật thẻ của bạn để bao gồm SQL-Server. Bạn nên đưa nó vào câu hỏi tiếp theo. –

+2

Một báo trước, nếu bất kỳ ngày nào không hợp lệ, SQL sẽ trả về lỗi trên chuyển đổi, làm cho truy vấn của bạn không hợp lệ. Có thể bực bội vì bạn phải tìm ra ngày nào gây ra sự cố. Bạn có thể sử dụng IsDate() = 0 để xem bạn có bất kỳ ngày không hợp lệ nào để lo lắng về – Sparky

17

Hãy thử: (. Bằng cách sử dụng nặc danh)

ORDER BY MONTH(Date),DAY(DATE) 

EDIT

Tôi tin rằng bài này được thực hiện với, tuy nhiên người sử dụng này trên đã đánh vào cái gì mà giải quyết vấn đề của tôi trên tất cả những người khác.

Nếu có ai gặp sự cố với các giải pháp khác, hãy thử một mod nhỏ của mã trên.

ORDER BY YEAR(Date) DESC, MONTH(Date) DESC, DAY(DATE) DESC 

Đây là cách tiếp cận cuối cùng của tôi và nó hoạt động hoàn hảo trên JET DB.

PS. Tôi hy vọng không có ai thực sự đang sử dụng Date làm tên trường của họ ;-)

+0

Đây là kết quả của OP nói rằng họ đang nhận được và họ không muốn! –

+0

lol, Dường như tôi đã hiểu sai câu hỏi và vẫn có 2 phiếu bầu! –

+0

Cảm ơn, bạn tiết kiệm thời gian của tôi :) –

4

loại trường nào là không chính xác tôi cho rằng bạn không đặt nó thành một số loại Ngày/Giờ đại diện , nhưng một chuỗi. Và sau đó cách viết ngày của Mỹ là khó chịu để sắp xếp

+0

bất cứ ai thiết lập điều này có EventDate thiết lập như là một varchar vì lý do nào:/ – user570457

3

Nếu bạn đã định dạng lại định dạng ngày thành YYYY/MM/DD thì bạn có thể sử dụng thứ tự chuỗi đơn giản này để đạt được định dạng bạn cần.

Ngoài ra, bằng cách sử dụng lệnh SUBSTR(store_name,start,length) bạn sẽ có thể cơ cấu lại thời hạn sắp xếp thành các định dạng trên

có lẽ bằng cách sử dụng sau đây

SELECT  * 
FROM   vw_view 
ORDER BY SUBSTR(EventDate,6,4) + SUBSTR(EventDate, 0, 5) DESC 
6

Bạn có lĩnh vực trong một chuỗi, vì vậy bạn sẽ cần phải chuyển nó sang datetime

order by CONVERT(datetime, EventDate) desc 
3

Giả sử rằng bạn có sức mạnh để làm cho sơ đồ thay đổi câu trả lời chấp nhận chỉ cho câu hỏi này IMO là thay đổi kiểu dữ liệu cơ sở thành một cái gì đó thích hợp hơn (ví dụ: date nếu SQL Server 2008).

Lưu trữ ngày là mm/dd/yyyy chuỗi là không gian không hiệu quả, khó xác thực chính xác và làm cho việc sắp xếp và tính toán ngày không cần thiết đau đớn.

Các vấn đề liên quan