1

I'm looking to update existing DATETIME values to yesterdays date and previous depending on their DATE order but keep the TIME part as it is.

For example assuming today's date is 2013-05-15 14:19:50, and I have two existing DATETIME values of 2013-01-04 01:25:45 and 2013-01-03 01:08:33. I would like to programatically update them to 2013-05-14 01:25:45 and 2013-05-13 01:08:33.

Has anyone got a better way of doing this?

My attempt

IF EXISTS
        (
        SELECT  1 
        FROM    tempdb..sysobjects 
        WHERE   id = object_id ('tempdb..#Date') 
        AND     xtype = 'U'
        )

        DROP TABLE #Date

CREATE
TABLE   #Date
        (
        ID          INT IDENTITY(1,1) PRIMARY KEY CLUSTERED(ID),
        [DateTime]  DATETIME
        )

INSERT
INTO    #Date
        (
        [DateTime]
        )

VALUES  ('2012-12-31 01:25:45')
        ,('2012-12-31 01:25:44')
        ,('2012-12-31 01:25:44')
        ,('2012-12-30 01:08:34')
        ,('2012-12-30 01:08:33')
        ,('2012-12-30 01:08:33')
        ,('2012-12-29 00:43:01')
        ,('2012-12-29 00:43:00')
        ,('2012-12-29 00:43:00')
        ,('2012-12-28 00:25:07')
        ,('2012-12-28 00:25:07')
        ,('2012-12-28 00:25:07')


SELECT  *
FROM    #Date   


;WITH   CTE
AS  (
    SELECT  DENSE_RANK() OVER (ORDER BY CONVERT(DATE,[DateTime]) DESC) AS DENSERANK,
            [DateTime]
    FROM    #Date
    )

UPDATE  CTE
SET     [DateTime] = DATEADD(DAY,DATEDIFF(DAY,[DateTime],GETDATE()-DENSERANK),[DateTime])       


SELECT  *
FROM    #Date
4

1 回答 1

0

我认为这可以代替您当前的UPDATE. 好还是不好,值得商榷:

update #Date set DateTime =
     DATEADD(day,
        (select MIN(DATEDIFF(day,DateTime,CURRENT_TIMESTAMP)) from #Date) --How many days since the most recent event recorded?
        -1, --Make that most recent event yesterday
     DateTime)

简单的观察是,添加到每个事件的天数是一个常数 - 它只是从最近的事件到今天的天数。

于 2013-05-15T13:47:11.480 回答