2010-07-19 13 views
8

Jaki jest najlepszy sposób na usunięcie daty z czasu DATETIME, aby tylko czas pozostał do porównania?Data paska TSQL z datetime

wiem, że mogę wykonać następujące czynności:

CONVERT(DATETIME, CONVERT(VARCHAR(8), GETDATE(),8)) 

Ale ta obejmuje konwersję i znaków. Gdybym chciał sprawdzić, czy czas (w tym minuty) był pomiędzy dwoma innymi czasami przechowywanymi w kolumnach DATETIME, czy istnieje elegancki sposób na to, bez konieczności polegania na konwersji na ciągi znaków?

+0

wartość 'DATETIME' będzie alw ays ma element daty (wskazówka w nazwie :), więc jedynym sposobem na dosłowne usunięcie daty "pozostało tylko tyle czasu" jest rzutowanie jej jako typu, który nie ma elementu daty, tj. odpowiedzi @Mike M.. – onedaywhen

+0

Powinienem był określić, że nasze oprogramowanie używa SQL2005 (i zostało zaprojektowane w erze SQL2000, więc typ danych TIME, który jest nową funkcją SQL2008, nie jest wykonalnym rozwiązaniem.Jeśli spojrzysz na odpowiedź, która została oznaczona jako poprawna, Zobaczę eleganckie rozwiązanie: – t3rse

Odpowiedz

9

Wypróbuj funkcję TimeOnly z Essential SQL Server Date, Time, and DateTime Functions:

create function TimeOnly(@DateTime DateTime) 
returns datetime 
as 
    begin 
    return dateadd(day, -datediff(day, 0, @datetime), @datetime) 
    end 
go 

Albo po prostu rzucić DateTime jako czas w SQL Server 2008:

declare @time as time 
set @time = cast(dateTimeVal as time) 
1
DECLARE 
    @Now DateTime, 
    @Today DateTime, 
    @Time DateTime 

SET @Now = GetDate() 
SET @Today = DateAdd(dd, DateDiff(dd, 0, @Now), 0) 

SET @Time = DateAdd(ss, DateDiff(ss, @Today, @Now), 0) 

SELECT @Time 
+0

Piękny, absolutnie piękny w MSDE DB, użyłem obliczeń @ Today do usunięcia czasu z minionej daty, działa wspaniale. – KeithS

11

Jeśli używasz SQL 2008

SELECT CAST(GETDATE() AS TIME) 
Powiązane problemy