2013-09-02 6 views
17

Mam sql table z kolumną daty o nazwie CREATED_TS, która przechowuje daty w innym formacie np. jak pokazano poniżejjak przekonwertować datę na format "mm/dd/rrrr"

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 

Teraz chcę konwertować je do formatu mm\dd\yyyy przed jak ja porównując daty WHERE klauzuli mojego SELECT zapytania.

Próbowałem za pomocą

CONVERT(VARCHAR(10),CREATED_TS,101) 

ale dostał wynik jako,

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 

muszę wynik jak np. 02/20/2012 w celu porównania.

Każda pomoc zostanie doceniona.

+4

Twój problem polega na tym, że przechowujesz daty jako varchary! Nie ma żadnego powodu, aby to robić kiedykolwiek. Przechowuj daty jako daty! [Proszę podać ten artykuł jako przeczytany] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/12/bad-habits-to-kick-using-the-wrong-data-type.aspx) – GarethD

+0

@GarethD Powinien przechowywać je jako datetime –

Odpowiedz

31

Jako dane już w varchar, trzeba przekształcić go w terminie pierwszy:

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

Jest to poprawne, jeśli chodzi o konwersję do daty pierwszej, ale '111' dotyczy' rrrr/mm/dd', OP ma już odpowiedni styl (101). – GarethD

+0

uzyskałem wymagane dane wyjściowe za pomocą Twojej sugestii, ale konieczne było przekonwertowanie daty, którą chcę porównać z tym formatem. – Rohaan

+0

Konwersja (varchar (10), , 111). Ale, szczerze mówiąc, warto pomyśleć o przechowywaniu i porównywaniu dat jako –

21

Zastosowanie CONVERT z Value specyfikatorem z 101, podczas odlewania swoje dane do date:

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

@DarrenDavies Nauczył się od potężnych Dazefs;) – mattytommo

+0

111 jest dla 'yyyy/mm/dd', OP ma odpowiedni styl (101) problemem jest to, że kolumna jest już varchar a nie datę, więc styl nie jest stosowany. – GarethD

+0

@GarethD Dobry krzyk, zaktualizowany. – mattytommo

5

Szukasz czegoś takiego?

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 

wyjściowa:

 
| 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 | 

Oto SQLFiddle demo

0

Zastosowanie:

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

lub

select format(cast(CREATED_TS as date), 'MM/dd/yyyy') -- MySQL 3.23 and above 
Powiązane problemy