2013-04-02 34 views
7

Mam następujący problem, używam SQL Server MS i poniżej jest mój wynik. Wygląda to prosto, ale nie mogę tego zrozumieć.Jak wyświetlić czas tylko z AM/PM tylko w zapytaniu SQL?

Moje zapytanie:

SELECT RIGHT(CONVERT(VARCHAR(26), Timein, 109), 14) from vwSignIn 

da mi to jako 9: 12: 16: 597AM

chcę tego 9:12:16 AM jak mój wynik.

Dzięki z góry.

Odpowiedz

11

Oto jeden ze sposobów można to zrobić:

CONVERT(VARCHAR(8), Timein, 108) + ' ' + RIGHT(CONVERT(VARCHAR(30), Timein, 9), 2) 

SQL Fiddle Demo

+4

Udało się doskonale! Dziękuję bardzo! Chciałbym zagłosować, ale nie mam jeszcze wystarczającej liczby przedstawicieli. – Apollo

+0

@Apollo - np. Cieszę się, że mogłem pomóc! – sgeddes

+1

-1 - Przerwa na północ! – JNK

18

Oto podejście tylko jeden nawrócenia:

SELECT RIGHT(CONVERT(CHAR(20), GETDATE(), 22), 11); 

Jednakże należy rozważyć formatowanie to po stronie klienta, gdzie formatowanie ciągów znaków jest znacznie potężniejsze i bardziej odpowiednie.

W SQL Server 2012, będziesz mógł używać FORMAT(), co oznacza, że ​​nie musisz zapamiętywać wszystkich tych numerów stylu (ale nadal uważam, że lepiej robić to w warstwie prezentacji, jeśli to możliwe) :

SELECT FORMAT(GETDATE(), 'hh:mm:ss tt'); 

Po prostu strzeż się, FORMAT() is expensive relative to other approaches.

+0

OSTRZEŻENIE: Istnieje różnica między tymi dwoma! Pierwsze daje puste wypełnienie na kilka godzin <10 (np. '3:33 PM'), a drugie wykorzystuje wyściełane zero (na przykład '03: 33 PM '). Jeśli chcesz uniknąć wyprzedzającego miejsca na godziny przed 10, po prostu zapakuj LTTR(). Aby uniknąć wyściełanego Zero, użyj tego ciągu Formatuj zamiast: 'h: mm: ss tt' Aby zastąpić pierwszą odpowiedź zero, użyj zamiast tego: WYBIERZ PRAWO ('0' + LTRIM (PRAWO (CONVERT (CHAR (20), GETDATE(), 22), 11)), 11) Tak, myślę, że to obejmuje. – MikeTeeVee

+0

Biorąc pod uwagę, że jest 2015 r. W momencie pisania tego komentarza, bardzo upowszechniłem opcję FORMAT() –

+1

@Zoran dlaczego? Czy wiesz, że nie wszystkie nowe, błyszczące rzeczy są lepsze? http://sqlperformance.com/2015/06/t-sql-queries/format-is-nice-and-all-but –

1

znajdę ten sposób, aby być nieco bardziej eleganckie:

SELECT LTRIM(Right(REPLACE(CONVERT(nvarchar(MAX),CAST(GetDate() as smalldatetime), 109),':00:000', ' '), 8)); 
0

Najprostszym sposobem Chyba jest:

select ISNULL(CONVERT(VARCHAR(10), Timein, 100), '') 
1
SELECT substring(convert(varchar(20), GetDate(), 9), 13, 5) + ' ' + substring(convert(varchar(30), GetDate(), 9), 25, 2) 
+2

Witamy w Stack Overflow! Jeśli mógłbyś wyjaśnić swoją odpowiedź, łatwiej byłoby ci to zrozumieć, dziękuję. – jv42

Powiązane problemy