DATEDIFFステートメントを使用したこのINSERTが正しく機能しないのはなぜですか?

StackOverflow https://stackoverflow.com/questions/812047

  •  03-07-2019
  •  | 
  •  

質問

INSERT INTO timecrunch.dbo.intervals (IntervalID, Duration) 
SELECT ixInterval, DATEDIFF(hour, dtStart, dtEnd) FROM fogbugz.dbo.TimeInterval
WHERE dtEnd is not NULL

IntervalIDはint、Durationはfloatです

すべての時間間隔をDuration列に入れようとしています... 1時間未満であっても、フロートを入れる理由は分数を使用すると思いますか?

ヘルプ。

PS:エラーなしで正常に実行されていますが、実行後も間隔テーブルはまだ空です...データはTimeIntervalテーブルにありますが...

役に立ちましたか?

解決

データが表示されない理由はわかりませんが、DATEDIFFはfloatを返しません。フロートを取得するには、おそらくより短い時間単位を使用し、1分あたりのユニット数で除算する必要があります。例:

DATEDIFF(second, dtStart, dtEnd) / (3600.0)

他のヒント

DATEDIFFは、交差した日付部分の境界の数のIntを返します。 IntからFloatへの暗黙的な変換に問題がない限り、時間数の下限を取得することを期待します。

受信したエラーメッセージを投稿することも役立ちます。

実際の1時間の端数を挿入するには、次を使用します。

INSERT INTO timecrunch.dbo.intervals (IntervalID, Duration) 
SELECT 
  ixInterval, 
  DATEDIFF(mi, dtStart, dtEnd) / 60.0
FROM 
  fogbugz.dbo.TimeInterval
WHERE 
  dtEnd is not NULL

DATEDIFFは常に分数ではなくINT値を返します。

クエリが実際にデータを返していることを確認するために、INSERTビットでSELECTを単独で実行してみてください。

編集:他の人が言ったように、DATEDIFFはフロートではなくintを返しますが、INSERTがデータを挿入することを防ぐべきではありません。

まず、selectを実行するだけでどのような結果が得られますか?

SQL Serverでは、DateDiffはintを返します ( MSDNを参照

DATEDIFFは、floatではなくintを返します-発生している問題ですか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top