2

2 つの TIMESTAMP nullable フィールド MODIFIED と CURR_MODIFIED を持つテーブル AT_OBJECT があります。それらを比較する必要がありますが、ミリ秒はカウントされません。今のところ、SQLリクエストを使用しています:

SELECT 
  * 
FROM 
  at_object o 
WHERE 
  DATEDIFF(SECOND, 
    COALESCE(o.modified,      cast('01.01.2000 00:00:00.0000' as TIMESTAMP)), 
    COALESCE(o.curr_modified, cast('01.01.2000 00:00:00.0000' as TIMESTAMP))) > 0

動作しますが、見栄えが悪いです。ミリ秒なしでタイムスタンプを比較するより良い方法はありますか?

4

2 に答える 2

1

以下のような数式を使用してミリ秒を削除できます (実際にはすべてのミリ秒をゼロに変換します)

DATEADD(ms, -DATEPART(ms, date), date) 

そう

.
.
.
WHERE
   DATEADD(ms, -DATEPART(ms, date1), date1) = DATEADD(ms, -DATEPART(ms, date2), date2) 

そして、それをユーザー定義関数に置き換えることで、それをすべてきれいにすることができます(私の構文が正しいことを願っています。ここにはFirebirdがインストールされていません)

CREATE FUNCTION removeMs
(    
    @inDateTime
) 
RETURNS DateTime 
AS
BEGIN
    RETURN DATEADD(ms, -DATEPART(ms, @inDateTime), @inDateTime)
END

それから素敵できれい!

WHERE
   removeMs(date1) = removeMs(date2)

編集:Firebirdの場合、基本的な概念は機能するはずですが、機能はわずかに異なります

DATEPART -> EXTRACT(MILLISECOND FROM date1)
DATEADD -> DATEADD(MILLISECOND, -1 * EXTRACT(MILLISECOND FROM date1), date1)

これらはすべて、ユーザー定義関数でクリーンアップできます (うまくいけば、私の構文は正しいです)

于 2013-06-11T15:52:09.287 に答える
0

ミリ秒の部分がまったく必要ない場合 (ソフトウェアやクエリでは不要)、最も簡単な解決策は、タイムスタンプを適切な精度で、つまりミリ秒なしで保存することです。DDL では次のようになります。

CREATE TABLE T (
  Foo TIMESTAMP DEFAULT CURRENT_TIMESTAMP(0) NOT NULL
);

注意CURRENT_TIMESTAMP(0)- これは、ユーザーが値を指定しない場合にエンジンによって挿入されたデフォルト値を処理します。ユーザーがフィールドに入力することがある場合はBEFORE INSERT OR UPDATE、タイムスタンプからミリ秒の部分を「削除」するトリガーも作成する必要があります。

于 2013-06-11T15:52:35.390 に答える