2012-02-16 10 views
7
CAST(DATEPART(hh, timestamp) AS varchar(2)) + ':00' AS Hour 

To dostanie mi godzinę poza polem znaczników czasu, ale w przypadku godzin 0-9 nie ma wiodącego zera, a zatem kiedy sortuję po godzinie, nie sortuję poprawnie.Suma godzinowa z datetime bez zaniku wiodącego zera w jednocyfrowych godzinach

Nie jestem pewien, co jest nie tak. Podaję 2 char varchar, aby umożliwić dodatkowy pokój dla wiodącego zera. Mam nadzieję, że istnieje sposób, aby to naprawić, nie przepuszczając mojego pola przez funkcję, która pokryje dla mnie początkowe zero.

Odpowiedz

16
SELECT RIGHT('0' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE())), 2) + ':00'; 

Nie chcesz podkładać pod 0? OK, można zrobić bardzo podobnie brzydki sposób bez bałaganu padding:

SELECT LEFT(CONVERT(TIME(0), GETDATE()), 2) + ':00'; 

Oczywiście zastąpić GETDATE() z nazwą kolumny. Mam nadzieję, że tak naprawdę nie jest to timestamp, ponieważ jest to słowo zarezerwowane - dla typu danych, który nie ma nic wspólnego z datą lub czasem, niestety.

Jeśli nie lubisz któregokolwiek z tych rozwiązań, po prostu wybierz dane z SQL Server i pozwól aplikacji klienckiej obsługiwać szczegóły formatowania/prezentacji. Z pewnością jest to łatwe do zrobienia dzięki funkcji C# na przykład format().

+0

Tak, to zrobiłem. A więc ta składnia mówi "weź dwa właściwe znaki wyniku konwersji i na początku zero"? – TWood

+0

Pierwszy przykład mówi "dodaj wiodącą liczbę 0 do godziny, następnie weź 2 właściwe znaki" ... i nadal jest ważna dla użytkowników SQL Server 2005 lub niższych, którzy nie mają nowego typu danych "TIME" . –

+0

Aby uzyskać więcej informacji o mylwie 'timestamp', zobacz http://connect.microsoft.com/SQLServer/feedback/details/274333/ –

3

Zakładając timestamp jest kolumna w tabeli

select convert(char(3), timestamp, 108) + '00' AS Hour 
from yourtable 

alternatywna

select left(cast(dateadd(hh, datediff(hh, 0, timestamp), 0) as time), 5) 
from yourtable 

Edit:

Po przetestowaniu trochę doszedłem do wniosku, że jest to najszybszy sposób (prawie wydajność i składnia jako rozwiązania Aarona)

SELECT RIGHT(100 + DATEPART(HOUR, timestamp) , 2) + ':00' 
from yourtable 
2

Możesz użyć typu TIME, który domyślnie jest ustawiony na 24 godziny;

cast(cast(timestamp as time) AS varchar(2)) + ':00' AS Hour 
+0

Nie wiedziałem nawet o typie czasu ... Dzięki za napiwek! – TWood

Powiązane problemy