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(…)
在执行更新之前,将其输出到单独的语句中,并将要偏移的天数存储到变量中