如何更新DateTime字段?

时间:2009-12-10 16:26:05

标签: sql-server datetime triggers

是否有插入新数据时可用于更改DateTime字段的数据库级功能(触发器或其他内容)?问题在于,我正在整合的服务恰好在GMT中发送所有时间(在这种情况下是在他们的结尾收到一些信息的时间)。

我需要自动更改此值以反映数据库服务器所在时区的时间。例如,如果他们在下午2:34发送给我,但我在纽约,我希望将其输入数据库上午9:34。这也需要考虑GMT和服务器之间的夏令时差异,这似乎是一场噩梦。有什么建议吗?

此外,如果有帮助,我正在使用SQL Server 2005.

编辑:

让我澄清一件事。每隔一段时间(5,10,15分钟)批量检索进入此列的日期,因此我认为唯一的方法是在收到时更改时间,而不是添加TimeModified字段或其他内容。这甚至可行吗?

4 个答案:

答案 0 :(得分:15)

你可以创建

  • 插入新记录时设置的DateTime默认值

    CREATE TABLE dbo.YourTable
    ( ........,
      LastModifiedOn DATETIME 
          CONSTRAINT DF_YourTable_LastModifiedOn DEFAULT (GETDATE())
    )
    
  • 更新后触发器,只要您更新了行,就会将DateTime字段设置为新值

    CREATE TRIGGER trgAfterUpdate
    ON dbo.YourTable
    AFTER UPDATE 
    AS BEGIN
       UPDATE dbo.YourTable
       SET LastModifiedOn = GETDATE()
       FROM INSERTED i
       WHERE i.Table1ID = YourTable.Table1ID
    END
    

使用默认值和触发器,您的日期时间字段LastModifiedOn应始终保持最新并显示上次修改日期/时间。

马克

答案 1 :(得分:1)

此处的另一个选项是使用日历表,您可以将UTC日期和时间映射到本地日期和时间值。

这里的缺点是某些粒度的损失。如果秒是重要的,我不会实现这个;您可以查看日历记录的大小,并将其与存储事务表中每条记录的日期时间的大小进行比较。显然,体积越小,该解决方案的益处越少。此外,如果您没有在解决方案中构建自动和无人值守的重新填充未来记录,那么表格将“用完”记录,并且您将为您之后的任何人(也许是您自己)留下定时炸弹。

虽然优点是您可以更快地对此表执行任何查询(因为它是一个整数)。此外,如果您确定您的NYC服务器需要转移到萨克拉门托,您可以更新“localDateTime”并保持UTC时间。

表格结构(粒度将根据您的需要而定):

ID int      
utc_month int  
utc_day int  
utc_year int  
utc_hour int  
utc_minute int  
local_month int  
local_day int  
local_year int  
local_hour int  
local_minute int

然而另一个选项(再次取决于卷)是部署托管程序集。 (有关说明,请参阅此站点,您必须更改服务器配置。How to implement a managed udf or sp


这是我放在udf

中的C#
public static SqlDateTime udf_ConvertUTCDateTime(SqlDateTime utcDateTime)  
{  
    DateTime dt = utcDateTime.Value;  
    utcDateTime = dt.ToLocalTime();  
    return utcDateTime;  
}

以下代码将返回转换后的UTC日期时间。只需在插入或触发器中使用该值即可。

Declare @D datetime
set @D = GetUTCDate()

select @D

select dbo.udf_ConvertUTCDateTime(@D)

答案 2 :(得分:0)

创建Timestamp类型的字段 - 只要在该行中修改了任何数据,该字段就会更新。唉,它实际上是一个相对时间戳,所以它只能用于版本控制。更多信息可以在这里找到: http://msdn.microsoft.com/en-us/library/ms182776(SQL.90).aspx

答案 3 :(得分:0)

以下示例应该完成这项工作。将ModifiedOn或类似的DateTime字段添加到数据库表。

insert into foo (field1, field2, ...., ModifiedOn)
values (value1, value2,...., GetDate())

或更新

update Foo
set field1 = value1,
    field2 = value2,
    .
    .
    .
    .,

    ModifiedOn = GetDate()
Where ....