Лучший способ преобразовать DateTime в “n несколько Часов Назад” в SQL

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

6
задан SqlRyan 28 September 2009 в 20:53
поделиться

6 ответов

Как Вы говорите, я, вероятно, не сделал бы этого в SQL, но поскольку осуществление мысли имеет реализацию MySQL:

CASE
    WHEN compare_date between date_sub(now(), INTERVAL 60 minute) and now() 
        THEN concat(minute(TIMEDIFF(now(), compare_date)), ' minutes ago')

    WHEN datediff(now(), compare_date) = 1 
        THEN 'Yesterday'

    WHEN compare_date between date_sub(now(), INTERVAL 24 hour) and now() 
        THEN concat(hour(TIMEDIFF(NOW(), compare_date)), ' hours ago')

    ELSE concat(datediff(now(), compare_date),' days ago')
END

На основе подобного образца, замеченного на страницах руководства MySQL Date and Time

7
ответ дан 8 December 2019 в 16:13
поделиться

Ваш код выглядит функциональным. Что касается лучшего пути, который собирается стать субъективным. Вы могли бы хотеть проверить эту страницу, поскольку она имеет дело с отрезками времени в SQL.

1
ответ дан 8 December 2019 в 16:13
поделиться

Моя попытка - это - для MS SQL. Это поддерживает 'назад' и 'с этого времени', плюрализация, и это не использует округление или datediff, но усечение - datediff дает разность 1 месяца между 8/30 и 9/1, который является, вероятно, не, что Вы хотите. Округление дает разность 1 месяца между 9/1 и 9/16. Снова, вероятно, не, что Вы хотите.

CREATE FUNCTION dbo.GetFriendlyDateTimeValue( @CompareDate DATETIME ) RETURNS NVARCHAR(48) AS BEGIN
declare @s nvarchar(48)
set @s='Now'
select top 1 @s=convert(nvarchar,abs(n))+' '+s+case when abs(n)>1 then 's' else '' end+case when n>0 then ' ago' else ' from now' end from (
 select convert(int,(convert(float,(getdate()-@comparedate))*n)) as n, s from (
  select 1/365 as n, 'Year' as s union all
  select 1/30, 'Month' union all
  select 1, 'Day' union all
  select 7, 'Week' union all
  select 24, 'Hour' union all
  select 24*60, 'Minute' union all
  select 24*60*60, 'Second'
 ) k
) j where abs(n)>0 order by abs(n)
return @s
END
2
ответ дан 8 December 2019 в 16:13
поделиться

Как насчет этого? Вы могли развернуть этот шаблон, чтобы сделать сообщения "лет", и Вы могли вставить проверку на "1 день" или "1 час", таким образом, он не скажет "1 день назад"...

Мне нравится Оператор выбора в SQL.

drop function dbo.time_diff_message    
GO

create function dbo.time_diff_message (
    @input_date datetime
)
returns varchar(200)    
as    
begin    
declare @msg varchar(200)    
declare @hourdiff int

set @hourdiff = datediff(hour, @input_date, getdate())    
set @msg = case when @hourdiff < 0 then ' from now' else ' ago' end    
set @hourdiff = abs(@hourdiff)    
set @msg = case when @hourdiff > 24 then convert(varchar, @hourdiff/24) + ' days' + @msg
                else convert(varchar, @hourdiff) + ' hours' + @msg
            end

return @msg
end

GO    
select dbo.time_diff_message('Dec 7 1941')
1
ответ дан 8 December 2019 в 16:13
поделиться

В Oracle:

select
  CC.MOD_DATETIME,
  'Last modified ' ||
  case when (sysdate - cc.mod_datetime) < 1
       then round((sysdate - CC.MOD_DATETIME)*24) || ' hours ago'
       when (sysdate - CC.MOD_DATETIME) between 1 and 7
       then round(sysdate-CC.MOD_DATETIME) || ' days ago'
       when (sysdate - CC.MOD_DATETIME) between 8 and 365
       then round((sysdate - CC.MOD_DATETIME) / 7) || ' weeks ago'
       when (sysdate - CC.MOD_DATETIME) > 365   
       then round((sysdate - CC.MOD_DATETIME) / 365) || ' years ago'
       end
from 
  customer_catalog CC
3
ответ дан 8 December 2019 в 16:13
поделиться

Спасибо за различный код, опубликованный выше.

Как указал Хафтор, исходный код имеет ограничения, связанные с округлением. Я также обнаружил, что некоторые результаты, которые выдал его код, не совпадают с тем, что я ожидал, например, в пятницу днем ​​-> в понедельник утром будет отображаться как «2 дня назад». Я думаю, мы все позвонили бы так 3 дня назад, хотя еще не прошло 3 полных 24-часовых периода.

Итак, я внес поправки в код (это MS SQL). Заявление об ограничении ответственности: я начинающий кодировщик TSQL, так что это довольно хакерский метод, но он работает !!

Я сделал несколько переопределений - например, все, что до 2 недель, выражается в днях. Все, что превышает 2 месяца, выражается в неделях. Все, что сверх этого, происходит в месяцах и т. Д. Мне показалось, что это интуитивно понятный способ выразить это.

CREATE FUNCTION [dbo].[GetFriendlyDateTimeValue]( @CompareDate DATETIME ) RETURNS NVARCHAR(48) AS BEGIN
declare @s nvarchar(48)

set @s='Now'
select top 1 @s=convert(nvarchar,abs(n))+' '+s+case when abs(n)>1 then 's' else '' end+case when n>0 then ' ago' else ' from now' end from (
 select convert(int,(convert(float,(getdate()-@comparedate))*n)) as n, s from (
  select 1/365 as n, 'year' as s union all
  select 1/30, 'month' union all
  select 1/7, 'week' union all
  select 1, 'day' union all
  select 24, 'hour' union all
  select 24*60, 'minute' union all
  select 24*60*60, 'second'
 ) k
) j where abs(n)>0 order by abs(n)

if @s like '%days%'
BEGIN
 -- if over 2 months ago then express in months
 IF convert(nvarchar,DATEDIFF(MM, @CompareDate, GETDATE())) >= 2
 BEGIN
  select @s = convert(nvarchar,DATEDIFF(MM, @CompareDate, GETDATE())) + ' months ago'
 END

 -- if over 2 weeks ago then express in weeks, otherwise express as days
 ELSE IF convert(nvarchar,DATEDIFF(DD, @CompareDate, GETDATE())) >= 14
 BEGIN
  select @s = convert(nvarchar,DATEDIFF(WK, @CompareDate, GETDATE())) + ' weeks ago'
 END

 ELSE
  select @s = convert(nvarchar,DATEDIFF(DD, @CompareDate, GETDATE())) + ' days ago'
END

return @s
END
1
ответ дан 8 December 2019 в 16:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: