sql >> Databáze >  >> RDS >> Sqlserver

Jak mohu porovnat čas na serveru SQL?

Vaše porovnání bude fungovat, ale bude pomalé, protože data jsou převedena na řetězec pro každý řádek. Chcete-li efektivně porovnat dvě časové části, zkuste:

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

Dlouhé vysvětlení:datum na serveru SQL je uloženo jako číslo s plovoucí desetinnou čárkou. Číslice před desetinnou čárkou představují datum. Číslice za desetinnou čárkou představují čas.

Zde je příklad data:

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

Pojďme to převést na float:

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

Nyní vezměte část za znakem čárky, tj. čas:

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

Převeďte jej zpět na datum a čas:

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

1900-01-01 je jen "nulové" datum; můžete zobrazit časovou část s převodem, specifikovat například formát 108, což je právě čas:

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

Konverze mezi datem a floatem jsou velmi rychlé, protože jsou v zásadě uloženy stejným způsobem.



  1. Sledujte signály pomocí datového modelu zpracování signálu

  2. Jak vytvořit přehled z tabulky v Accessu 2016

  3. SQL Server 2008 Spatial:Najděte bod v mnohoúhelníku

  4. Atomic UPSERT v SQL Server 2005