Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как мога да сравня времето в SQL Server?

Вашето сравнение ще работи, но ще бъде бавно, защото датите се преобразуват в низ за всеки ред. За да сравните ефективно две времеви части, опитайте:

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

Дълго обяснение:дата в SQL сървъра се съхранява като число с плаваща запетая. Цифрите преди десетичната запетая представляват датата. Цифрите след десетичната запетая представляват времето.

Ето примерна дата:

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

Нека го преобразуваме в float:

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

Сега вземете частта след знака запетая, т.е. часа:

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

Преобразувайте го обратно в дата и час:

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

1900-01-01 е просто "нулевата" дата; можете да покажете частта от времето с convert, като посочите например формат 108, което е точно времето:

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

Преобразуванията между datetime и float са доста бързи, защото основно се съхраняват по същия начин.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да търсите низ в бази данни на SQL Server

  2. Как да ПРОМЕНЯ няколко колони наведнъж в SQL Server

  3. 3 метода за възстановяване на всички индекси за всички таблици с T-SQL в база данни на SQL Server

  4. SQL GROUP BY CASE оператор с агрегатна функция

  5. Динамичен SQL (предаване на името на таблицата като параметър)