-8

このクエリで日付と時刻の差を取得しようとしています:

SELECT BASESCORE, 
       Max(CONVERT(DATETIME, '')) - Min(CONVERT(DATETIME, '')) AS datediff 
FROM   log 
GROUP  BY BASESCORE 
ORDER  BY BASESCORE 

それは正常に動作しますが、それが与える出力は間違っています:

   1900-01-01 00:00:00.000
   1900-01-01 00:00:00.000
   1900-01-01 00:00:00.000
   1900-01-01 00:00:00.000
   1900-01-01 00:00:00.000
                    ......

上記のクエリから正しい出力を取得するにはどうすればよいですか!

4

5 に答える 5

3

あなたが投稿したサンプルデータを使用して(そしてそれを少し調整して)、問題を解決するための私の試みは次のとおりです。

SELECT BASESCORE, 
       Datediff(dd, MINDATE, MAXDATE) 
FROM   (SELECT BASESCORE, 
               Cast(Max(DATETIME) AS DATETIME) MaxDate, 
               Cast(Min(DATETIME) AS DATETIME) MinDate 
        FROM   table1 
        GROUP  BY BASESCORE)T 

SQL Fiddleで完全に機能するバージョンを確認できます。

私が誤解していることがあれば教えてください;-)

于 2013-07-29T07:54:30.293 に答える
2

以前に dateformat をお見せしましたが、もう一度フォーマットを削除しましたが、コピーする時間がありました。これがあなたの望むクエリと結果であるように私には思えます:

declare @t table(datetime char(20), basescore int)
insert @t values('20/Mar/2013:03:17:43', 1),('20/Mar/2013:03:17:43', 2)
                ('20/Mar/2013:04:17:43', 1),('20/Mar/2013:03:20:43', 2)

SELECT basescore,  MAX(convertdate) - MIN(convertdate) AS datediff
-- when selecting from your own table remove '@t' from next line
FROM @t log
cross apply(select cast(stuff([datetime], 12, 1, ' ') as datetime) convertdate) a
group by basescore order by basescore

結果:

basescore   datediff
1   1900-01-01 01:00:00.000
2   1900-01-01 00:03:00.000
于 2013-07-29T07:56:56.263 に答える
1

を使用しDATEDIFF()ます。

構文 :DATEDIFF(datepart,startdate,enddate)

msdn

于 2013-07-29T07:24:27.220 に答える
1

前回の投稿編集から、「20/Mar/2013:03:17:44」のようなフィールド日時の値がわかります。日時の値からのフォーマットは、単純な方法では変換できません。

このクエリを試してください:

SELECT BASESCORE, 
       [DATEDIFF]= Datediff(second, Min(CONVERT(DATETIME, 
                                        LEFT(Rtrim(Ltrim(DATETIME)), 
                                        11) + ' ' 
                                        + RIGHT(Rtrim(Ltrim(DATETIME) 
                                        ), 8))), Max 
                               ( 
                               CONVERT(DATETIME, LEFT(Rtrim(Ltrim(DATETIME)), 11 
                                                 ) + ' ' 
                                                 + RIGHT(Rtrim(Ltrim(DATETIME)), 
                                                 8)))) 
FROM   temptabel 
GROUP  BY BASESCORE 
ORDER  BY BASESCORE 

出力:

Basescore    datediff
1            1
2            0
3            0

SQLFiddleで確認できます

于 2013-07-29T08:00:37.300 に答える