0

我正在将我的数据库从以太平洋时间存储日期时间转换为 UTC,但不会同时更改所有代码。

我正在尝试编写一个触发器,该触发器将更新在任一列中输入的时间并将它们转换并将它们插入到另一列中。

前任。如果我在 OriginalTime 列中插入太平洋时间,它应该将时间转换为 UTC 并使用 UTC 时间更新 NewTime 列。相反,如果我在 NewTime 中插入/更新值,它应该将时间转换回太平洋并将其放入 OriginalTime。

我是在循环错误还是什么?

ALTER TRIGGER tr_Calls_CreateDate ON Calls
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON

DECLARE
    @CallId INT,
    @CreateDate DATETIME,
    @CreateDateUTC DATETIME

--Create cursor
DECLARE CreateDate_Cursor CURSOR LOCAL FOR
    SELECT CallId, CreateDate, CreateDateUTC FROM Inserted

OPEN CreateDate_Cursor;

-- Get First Row
FETCH NEXT FROM CreateDate_Cursor INTO @CallId, @CreateDate, @CreateDateUTC;

WHILE @@FETCH_STATUS = 0
BEGIN
    IF UPDATE ([CreateDate])
    BEGIN
        UPDATE Calls
        SET CreateDateUTC = dbo.ConvertPacificTimeToUTC(@CreateDate)
        WHERE CallId = @CallId
    END

    IF UPDATE ([CreateDateUTC])
    BEGIN
        UPDATE Calls
        SET CreateDate = dbo.ConvertUTCTimeToPacific(@CreateDateUTC)
        WHERE CallId = @CallId
    END

    FETCH NEXT FROM CreateDate_Cursor INTO @CallId, @CreateDate, @CreateDateUTC;
END

-- Free Up Cursor
CLOSE CreateDate_Cursor;
DEALLOCATE CreateDate_Cursor;
END

出于某种原因,我当前的触发器正在正确输入转换后的值,但导致触发器触发的插入似乎失败了。

如果我插入一个值:

INSERT INTO Calls (CreateDate)
VALUES (GETDATE()) -- getdate currently outputs in pacific time

我得到了触发结果,但没有得到插入的值:

+-----------------+--------------------------+
|   CreateDate    |      CreateDateUTC       |
+-----------------+--------------------------+
|       NULL      | 2013-01-24 20:27:13.510  |
+-----------------+--------------------------+
4

1 回答 1

5

插入UPDATE(column)对所有列都为真。这就是您的第二次更新将 null 写入 CreateDate 列的原因。

因此,您需要创建两个触发器,一个处理代码中的更新,一个处理插入。如果只重视 CreateDate,则 CreateDateUTC 为 NULL,您可以检查它。

此外,您真的不应该为此使用游标。改用这样的东西:

UPDATE c SET
  CreateDate = ISNULL(CreateDate, dbo.ConvertUTCTimeToPacific(i.CreateDateUTC)),
  CreateDateUTC = ISNULL(CreateDateUTC, dbo.ConvertPacificTimeToUTC(i.CreateDate))
FROM dbo.Calls AS c
JOIN INSERTED AS i
ON i.CallId = c.CallId;

也就是说,对于插入触发器。对于 UPDATE 你可以使用这样的东西:

UPDATE c SET
  CreateDate = CASE WHEN UPDATE ([CreateDateUTC]) THEN CreateDate
                  ELSE dbo.ConvertUTCTimeToPacific(i.CreateDateUTC)
               END,
  CreateDateUTC = CASE WHEN UPDATE ([CreateDate]) THEN CreateDateUTC
                    ELSE dbo.ConvertPacificTimeToUTC(i.CreateDate)
                  END
FROM dbo.Calls AS c
JOIN INSERTED AS i
ON i.CallId = c.CallId;

这都是未经测试的代码,但它应该可以工作。


编辑:请参阅下面我更长的评论,了解为什么您真的应该将其包装UPDATEIF语句中。

于 2013-01-24T23:10:24.897 回答