Обновите значения DATETIME до <= GETDATE()-1
Я ищу, чтобы обновить существующие DATETIME
значения до вчерашней даты и предыдущего в зависимости от их DATE
порядок, но держать 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
1 ответ
Решение
Я думаю, что это работает вместо вашего нынешнего 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)
Простое наблюдение состоит в том, что количество дней, добавляемых к каждому событию, является постоянным - это просто количество дней с самого последнего события до сегодняшнего дня.