2013-09-02 111 views
17

Tôi đang có một sql table với cột ngày có tên CREATED_TS giữ ngày tháng ở định dạng khác, ví dụ: như hình dưới đâycách chuyển đổi ngày sang định dạng 'mm/dd/yyyy`

Feb 20 2012 12:00AM 
11/29/12 8:20:53 PM   
Feb 20 2012 12:00AM 
11/29/12 8:20:53 PM   
Feb 20 2012 12:00AM 
11/29/12 8:20:53 PM   
Nov 16 2011 12:00AM 
Feb 20 2012 12:00AM 
11/29/12 8:20:52 PM 

Bây giờ tôi muốn chuyển đổi các định dạng mm\dd\yyyy trước như tôi đang so sánh ngày tháng trong WHERE khoản của truy vấn SELECT tôi.

tôi đã cố gắng sử dụng

CONVERT(VARCHAR(10),CREATED_TS,101) 

nhưng có kết quả như,

Feb 20 201 
11/29/12 
Feb 20 201 
11/29/12 
Feb 20 201 
11/29/12 
Nov 16 201 
Feb 20 201 
11/29/12 

tôi cần kết quả như ví dụ. 02/20/2012 để so sánh.

Mọi trợ giúp sẽ được đánh giá cao.

+4

Vấn đề của bạn là vì bạn đang lưu trữ ngày tháng dưới dạng varchars! Không có lý do chính đáng để làm điều này bao giờ hết. Lưu trữ ngày tháng làm ngày! [Vui lòng đọc bài viết này] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/12/bad-habits-to-kick-using-the-wrong-data-type.aspx) – GarethD

+0

@GarethD Ông thực sự nên lưu trữ chúng như datetime –

Trả lời

31

Theo dữ liệu của bạn đã có trong varchar, bạn phải chuyển đổi nó vào ngày đầu tiên:

select convert(varchar(10), cast(ts as date), 101) from <your table> 
+7

Điều này đúng với việc chuyển đổi thành ngày đầu tiên, nhưng '111' là cho' yyyy/mm/dd', OP đã có kiểu đúng (101). – GarethD

+0

có yêu cầu đầu ra bằng cách sử dụng đề xuất của bạn nhưng cần thiết để chuyển đổi ngày tôi muốn so sánh với định dạng này .. – Rohaan

+0

chuyển đổi (varchar (10), , 111). Nhưng, thành thật mà nói, đáng để suy nghĩ về việc lưu trữ và so sánh ngày của bạn là ngày –

21

Sử dụng CONVERT với Value specifier của 101, trong khi đúc dữ liệu của bạn để date:

CONVERT(VARCHAR(10), CAST(Created_TS AS DATE), 101) 
+1

@DarrenDavies Học từ các Dazefs hùng mạnh;) – mattytommo

+0

111 là cho 'yyyy/mm/dd', OP có đúng kiểu (101) vấn đề là cột đã là một varchar và không phải là một ngày, vì vậy phong cách không được áp dụng. – GarethD

+0

@GarethD Xin chào, cập nhật. – mattytommo

5

bạn đang tìm thứ gì đó như thế này phải không?

SELECT CASE WHEN LEFT(created_ts, 1) LIKE '[0-9]' 
      THEN CONVERT(VARCHAR(10), CONVERT(datetime, created_ts, 1), 101) 
      ELSE CONVERT(VARCHAR(10), CONVERT(datetime, created_ts, 109), 101) 
     END created_ts 
    FROM table1 

Output:

 
| CREATED_TS | 
|------------| 
| 02/20/2012 | 
| 11/29/2012 | 
| 02/20/2012 | 
| 11/29/2012 | 
| 02/20/2012 | 
| 11/29/2012 | 
| 11/16/2011 | 
| 02/20/2012 | 
| 11/29/2012 | 

Đây là SQLFiddle bản demo

0

Sử dụng:

select convert(nvarchar(10), CREATED_TS, 101) 

hoặc

select format(cast(CREATED_TS as date), 'MM/dd/yyyy') -- MySQL 3.23 and above 
Các vấn đề liên quan