Как сказать сколько времени назад в тексте используя поле даты и SQL - PullRequest
0 голосов
/ 01 июня 2018

В библиотеке JavaScript moment.js мы можем вставить дату и получить относительную разницу дат отныне в длинном английском языке.Например, если бы я вводил вчерашнюю физическую дату, я бы получил ответ «вчера» (аналогично отметке времени в новостной ленте Facebook).

Кто-нибудь видел какие-либо примеры этого набора функций в SQL Server илисравнительная технология?Мне нужно понять логику для преобразования дат в английское представление, похожее на moment.js, чтобы я мог приступить к построению запроса.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Механизмы баз данных основаны на теории множеств, где такая работа явно выходит за рамки их применения.

Серверы баз данных также часто дорогостоящие для лицензирования, где время ЦП на БД значительно дороже по сравнению с временем ЦП на веб-сервере, сервере приложений или настольном компьютере.

Обычно серверы баз данныхтрудно масштабировать наружу, так что база данных часто является узким местом для производительности системы или приложения.Чем больше ресурсов ЦП вы сможете удалить из базы данных, тем быстрее будет работать приложение или тем больше пользователей оно сможет эффективно обслуживать.


Соберите все три из них вместе, и общая мудрость заключается в том, что эта работадолжно быть сделано вызывающим приложением.Пусть база данных просто вернет значение DateTime.Это хорошо, и может сделать это, сохраняя при этом дорогой и загруженный процессор.Позвольте клиентскому языку, такому как C # или Javascript, беспокоиться о преобразовании этого значения DateTime в строку типа «Вчера» или «Завтра».

Вообще говоря, отодвиньте форматирование как можно ближе к уровню пользователя / представления.

0 голосов
/ 02 июня 2018

Если вы открыты для TVF в качестве вспомогательной функции, которую я использую для расчета истекшего времени, возможно, что-то вроде этого

Пример

Declare @YourTable table (SomeDate datetime)
Insert Into @YourTable values
('2015-05-28 16:10:27'),
('2018-05-25 22:15:18'),
('2018-06-01 16:52:18'),
(dateadd(SECOND,-3,GetDate())),
(GetDate())


Select A.SomeDate
      ,B.*
      ,TimeAgo = case when years   > 0 then concat(years,' years ago') else 
                 case when months  > 0 then concat(months,' months ago') else
                 case when days    > 0 then concat(days,' days ago') else
                 case when hours   > 0 then concat(hours,' hours ago') else
                 case when minutes > 0 then concat(minutes,' minutes ago') else 
                 case when seconds > 0 then concat(seconds,' seconds ago') else 'just now'
                 end end end end end end
 From  @YourTable A
 Cross Apply [dbo].[tvf-Date-Elapsed] ( A.SomeDate,GetDate()) B

Возвращает

enter image description here

UDF, если интересно

CREATE FUNCTION [dbo].[tvf-Date-Elapsed] (@D1 DateTime,@D2 DateTime)
Returns Table
Return (
    with cteBN(N)   as (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)),
         cteRN(R)   as (Select Row_Number() Over (Order By (Select NULL))-1 From cteBN a,cteBN b,cteBN c),
         cteYY(N,D) as (Select Max(R),Max(DateAdd(YY,R,@D1))From cteRN R Where DateAdd(YY,R,@D1)<=@D2),
         cteMM(N,D) as (Select Max(R),Max(DateAdd(MM,R,D))  From (Select Top 12 R From cteRN Order By 1) R, cteYY P Where DateAdd(MM,R,D)<=@D2),
         cteDD(N,D) as (Select Max(R),Max(DateAdd(DD,R,D))  From (Select Top 31 R From cteRN Order By 1) R, cteMM P Where DateAdd(DD,R,D)<=@D2),
         cteHH(N,D) as (Select Max(R),Max(DateAdd(HH,R,D))  From (Select Top 24 R From cteRN Order By 1) R, cteDD P Where DateAdd(HH,R,D)<=@D2),
         cteMI(N,D) as (Select Max(R),Max(DateAdd(MI,R,D))  From (Select Top 60 R From cteRN Order By 1) R, cteHH P Where DateAdd(MI,R,D)<=@D2),
         cteSS(N,D) as (Select Max(R),Max(DateAdd(SS,R,D))  From (Select Top 60 R From cteRN Order By 1) R, cteMI P Where DateAdd(SS,R,D)<=@D2)

    Select [Years]   = cteYY.N
          ,[Months]  = cteMM.N
          ,[Days]    = cteDD.N
          ,[Hours]   = cteHH.N
          ,[Minutes] = cteMI.N
          ,[Seconds] = cteSS.N
          --,[Elapsed] = Format(cteYY.N,'0000')+':'+Format(cteMM.N,'00')+':'+Format(cteDD.N,'00')+' '+Format(cteHH.N,'00')+':'+Format(cteMI.N,'00')+':'+Format(cteSS.N,'00')
     From  cteYY,cteMM,cteDD,cteHH,cteMI,cteSS
)
--Max 1000 years
--Select * from [dbo].[tvf-Date-Elapsed] ('1991-09-12 21:00:00.000',GetDate())
--Select * from [dbo].[tvf-Date-Elapsed] ('2017-01-01 20:30:15','2018-02-05 22:58:35')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...