sql >> Database >  >> RDS >> Sqlserver

Hoe kan ik tijd vergelijken in SQL Server?

Uw vergelijking zal werken, maar het zal traag zijn omdat de datums voor elke rij worden geconverteerd naar een tekenreeks. Probeer om twee tijdsdelen efficiënt te vergelijken:

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

Lange uitleg:een datum in SQL-server wordt opgeslagen als een getal met drijvende komma. De cijfers voor de komma vertegenwoordigen de datum. De cijfers achter de komma vertegenwoordigen de tijd.

Dus hier is een voorbeelddatum:

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

Laten we het omzetten in een float:

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

Neem nu het gedeelte na de komma, d.w.z. de tijd:

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

Zet het terug naar een datetime:

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

De 1900-01-01 is slechts de "nul"-datum; je kunt het tijdsgedeelte weergeven met converteren, waarbij je bijvoorbeeld het formaat 108 specificeert, wat precies de tijd is:

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

Conversies tussen datetime en float zijn vrij snel, omdat ze in principe op dezelfde manier worden opgeslagen.



  1. PostgreSQL Regex-woordgrenzen?

  2. Hoe te installeren, beveiligen en prestatieafstemming van MariaDB Database Server

  3. SQL Server-query:snel met letterlijk maar traag met variabelen

  4. Hoe PCI-compliance voor MySQL en MariaDB te bereiken met ClusterControl - The Replay