Sql server 2008 将日期时间值更新为<;=GETDATE()-1

Sql server 2008 将日期时间值更新为<;=GETDATE()-1,sql-server-2008,tsql,sql-server-2005,sql-server-2008-r2,Sql Server 2008,Tsql,Sql Server 2005,Sql Server 2008 R2,我希望根据date顺序将现有的DATETIME值更新为昨天的日期和以前的日期,但保持TIME部分不变 例如,假设今天的日期是2013-05-15 14:19:50,我有两个现有的DATETIME值2013-01-04 01:25:45和2013-01-03 01:08:33。我想通过编程将它们更新为2013-05-14 01:25:45和2013-05-13 01:08:33 有人有更好的方法吗 我的尝试 IF EXISTS ( SELECT 1

我希望根据
date
顺序将现有的
DATETIME
值更新为昨天的日期和以前的日期,但保持
TIME
部分不变

例如,假设今天的日期是
2013-05-15 14:19:50
,我有两个现有的
DATETIME
2013-01-04 01:25:45
2013-01-03 01:08:33
。我想通过编程将它们更新为
2013-05-14 01:25:45
2013-05-13 01:08:33

有人有更好的方法吗

我的尝试

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

我认为这可以替代您当前的
更新。这是否更好是有争议的:

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-01-04
的所有内容都应该是昨天,
2013-01-03
的所有内容都应该成为前天,等等?这些值纯粹是示例日期。实际表格包含5年以上的日期,最新日期为2012年12月31日。所以2012-12-31应该变成2013-05-14,2012-12-30应该变成2013-05-13等等。按逻辑更新的示例内联值更有意义。@像素化-一旦你完成了我提到的观察,并且如果发现系统正在执行多个扫描,你可以移动
select MIN(…)
在执行
更新之前,将其输出到单独的语句中,并将要偏移的天数存储到变量中