0

Facebookでは、各ステータスで、作成日と現在の日付の間の時間を確認できます。元。1時間前、半年前、1年前…

だから、私のデータベース SQL では、作成日と NowDate の間の時間を説明する列を含むビューを作成したい - NVARCHAR(30) には、1 日前、2 か月前などの文字列が含まれる場合があります。

私は2つのDateTime変数を比較するための1つの解決策を持っていますが、明確ではありません:

  1. DateCreation と Now の間の時間を TimeInterval として計算します
  2. TimeInterval < 1 分 -> 「Just Now」の場合、TimeInterval >= 1 分かつ <60 分 -> 2 つの TimePoint 間の分を計算します。6 分 -> 「6 分前」と仮定します。
  3. 同様に、数か月または数年の期間。

これに対する他の解決策はありますか。

4

2 に答える 2

2

以下のようなコードを使用してデータを生成できます。1 か月に 30 日を使用したため、1 か月はあまり正確ではありません。何年もの間、私は 1 年 365 日使用していました。しかし、それは十分に正確であるべきだと思います。

declare @date1 as datetime = '20131103 13:00:40'
declare @date2 as datetime = '20160208 16:40:45'

select case 
    when datediff(ss, @date1, @date2) < 60 THEN cast(datediff(ss, @date1, @date2) as varchar(max)) + ' seconds ago'
    when datediff(ss, @date1, @date2) < 3600 THEN cast((datediff(ss, @date1, @date2) / 60) as varchar(max)) + ' minutes ago'
    when datediff(ss, @date1, @date2) < 86400 THEN cast((datediff(ss, @date1, @date2) / 3600) as varchar(max)) + ' hours ago'
    when datediff(ss, @date1, @date2) < 2592000 THEN cast((datediff(ss, @date1, @date2) / 86400) as varchar(max)) + ' days ago'
    when datediff(ss, @date1, @date2) < 31536000 THEN cast((datediff(ss, @date1, @date2) / 2592000) as varchar(max)) + ' months ago'
    else cast((datediff(ss, @date1, @date2) / 31536000) as varchar(max)) + ' years ago'
end

クエリの数値は、次の秒数から取得されます。

  • 分 = 60
  • 時間 = 3600
  • 日 = 86400
  • 月 = 2592000
  • 年 = 31536000

秒だけを使用しない簡単なバージョンは次のとおりです。

declare @date1 as datetime = '20131003 13:00:40'
declare @date2 as datetime = '20151101 16:40:45'

select case 
    when datediff(ss, @date1, @date2) < 60 THEN cast(datediff(ss, @date1, @date2) as varchar(max)) + ' seconds ago'
    when datediff(mi, @date1, @date2) < 60 THEN cast((datediff(mi, @date1, @date2)) as varchar(max)) + ' minutes ago'
    when datediff(hh, @date1, @date2) < 24 THEN cast((datediff(hh, @date1, @date2)) as varchar(max)) + ' hours ago'
    when datediff(dd, @date1, @date2) < 30 THEN cast((datediff(dd, @date1, @date2)) as varchar(max)) + ' days ago'
    when datediff(mm, @date1, @date2) < 13 THEN cast((datediff(mm, @date1, @date2)) as varchar(max)) + ' months ago'
    else cast((datediff(yy, @date1, @date2)) as varchar(max)) + ' years ago'
end
于 2013-11-03T02:55:36.607 に答える
1

これを次のような関数に入れます。

 create function dbo.TimeDiffToWords(@eventDateTime as DateTime)
    returns varchar(100)
    as 
    begin
    declare @ret varchar(100)
    declare @value int
    declare @done bit

set @done = 0

set @value = datediff(year, @eventDateTime, getdate())

if @value > 0
begin
    set @ret = 'Over '+cast(@value as varchar(6))+' year(s) ago.'
    set @done = 1
end

if @done = 0
begin
  set @value = datediff(month, @eventDateTime, getdate())
    if @value > 0
    begin
        set @ret = 'Over '+cast(@value as varchar(6))+' months(s) ago.'
        set @done = 1
    end
end

if @done = 0
begin
  set @value = datediff(day, @eventDateTime, getdate())
    if @value > 0
    begin
        set @ret = 'Over '+cast(@value as varchar(6))+' days(s) ago.'
        set @done = 1
    end
end

-- continue till down to seconds ago.
if @done = 0
begin
    set @ret = 'Not coded yet.'
end

return @ret

end

次に、このテスト コードのように呼び出すことができます。

select dbo.TimeDiffToWords(EventDateTime)
from (select dateadd(month,-40, getdate()) as EventDateTime
    union all select dateadd(day,-40, getdate())
    union all select dateadd(day,-6, getdate())
    union all select dateadd(day,-2, getdate())
    union all select dateadd(hour,-4, getdate())
    union all select dateadd(minute,-2, getdate())
) as testTimes
于 2013-11-03T03:12:36.407 に答える