-3

datetime日付部分をパラメーターとして渡された特定の日付(としてnvarchar(8)フォーマットされた)に置き換える必要がある値がたくさんありますYYYYMMDD。時間の部分は以前と同じままである必要があります。

たとえば、次のdatetime値の行があります。

Id | DocDate                 | CreationDate            | PrintDate 
1  | 2012-10-01 00:44:20.150 | 2012-10-07 00:44:20.150 | 2012-10-07 00:50:20.150

渡し'20121005'た場合、値は次のように変更されます。

Id | DocDate                 | CreationDate            | PrintDate
1  | 2012-10-05 00:44:20.150 | 2012-10-05 00:44:20.150 | 2012-10-05 00:50:20.150

どうやってやるの?

4

2 に答える 2

4
DECLARE @T TABLE (id int, docdate datetime,
                  creationdate datetime,
                  printdate datetime);
INSERT @t SELECT
 1, '2012-10-01 00:44:20.150',
    '2012-10-07 00:44:20.150',
    '2012-10-07 00:50:20.150';

DECLARE @newdate datetime = '20121005';

UPDATE @T SET
  docdate = dateadd(d,datediff(d,docdate,@newdate),docdate),
  creationdate = dateadd(d,datediff(d,creationdate,@newdate),creationdate),
  printdate = dateadd(d,datediff(d,printdate,@newdate),printdate);

SELECT * FROM @t;

日時の日付部分だけを変更するパターンは、最初に適用する必要のある差(日数)を見つけてから適用することです。

 e.g. datediff(d, '20121001', '20121008') => +7 days
      dateadd(d, <+7>, '20121001 xx:xx') => add the 7 days, keeping time
于 2012-10-06T22:19:04.887 に答える
0

率直に言って、あなたが答えを探している質問に答えているかどうかはわかりません。次回はもう少し冗長にしてみてください。そうは言っても、dateaddを使用してください。

DECLARE @Date1 datetime,
        @Date2 datetime

set @Date1 = '2012-01-01 16:53:20.150'
set @Date2 = '2012-10-06'

SELECT @Date1 as Original, @Date2 as NewDate, DATEADD(MILLISECOND, DATEDIFF(MILLISECOND, DATEADD(day, 0, DATEDIFF(day, 0, @Date1)), @Date1), @Date2) as Updated

生産:

Original                NewDate                 Updated
----------------------- ----------------------- -----------------------
2012-01-01 16:53:20.150 2012-10-06 00:00:00.000 2012-10-06 16:53:20.150

(1 row(s) affected)

基本的には、を使用DATEADD(day, 0, DATEDIFF(day, 0, @Date1))して日付を単独で取得し、上記の計算結果から合計日付を減算してその日のミリ秒数を取得し、それらを新しい日付に追加します。

文字列の操作や、単一のdatediffの結果に基づく仮定(DATEADD(MILLISECOND, (DATEDIFF(MILLISECOND, 0, @Date1) % 8600000), @Date2)頭に浮かぶ)を介してこれを実行することもできますが、それらは私を不安にさせます。

于 2012-10-06T22:02:40.980 に答える