sql >> Databasteknik >  >> RDS >> Sqlserver

Hur kan jag jämföra tid i SQL Server?

Din jämförelse kommer att fungera, men den kommer att gå långsamt eftersom datumen konverteras till en sträng för varje rad. För att effektivt jämföra två tidsdelar, försök:

declare @first datetime
set @first = '2009-04-30 19:47:16.123'
declare @second datetime
set @second = '2009-04-10 19:47:16.123'

select (cast(@first as float) - floor(cast(@first as float))) -
       (cast(@second as float) - floor(cast(@second as float)))
       as Difference

Lång förklaring:ett datum i SQL-servern lagras som ett flyttal. Siffrorna före decimaltecknet representerar datumet. Siffrorna efter decimaltecknet representerar tiden.

Så här är ett exempeldatum:

declare @mydate datetime
set @mydate = '2009-04-30 19:47:16.123'

Låt oss konvertera det till en float:

declare @myfloat float
set @myfloat = cast(@mydate as float)
select @myfloat
-- Shows 39931,8244921682

Ta nu delen efter kommatecken, d.v.s. tiden:

set @myfloat = @myfloat - floor(@myfloat) 
select @myfloat
-- Shows 0,824492168212601

Konvertera tillbaka det till ett datum och tid:

declare @mytime datetime
set @mytime = convert(datetime,@myfloat)
select @mytime
-- Shows 1900-01-01 19:47:16.123

1900-01-01 är bara "noll"-datumet; du kan visa tidsdelen med convert, ange till exempel format 108, vilket bara är tiden:

select convert(varchar(32),@mytime,108)
-- Shows 19:47:16

Omvandlingar mellan datetime och float går ganska snabbt, eftersom de i princip lagras på samma sätt.



  1. Hur man säkerhetskopierar och återställer en PostgreSQL-databas

  2. Hur man kontrollerar om en lagrad procedur finns innan den skapas

  3. MySQL:Ogiltig användning av gruppfunktionen

  4. Så här konfigurerar du kluster-till-klusterreplikering för PostgreSQL