Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 更新日期时间字段时如何更改它?_Sql Server_Datetime_Triggers - Fatal编程技术网

Sql server 更新日期时间字段时如何更改它?

Sql server 更新日期时间字段时如何更改它?,sql-server,datetime,triggers,Sql Server,Datetime,Triggers,在插入新数据时,是否有一个数据库级函数(触发器或其他什么)可以用来更改DateTime字段?问题是,我正在集成的服务恰好在GMT中发送所有时间(在本例中,是接收到某些信息的时间) 我需要自动更改它以反映db服务器所在时区的时间。例如,如果他们发送给我下午2:34,但我在纽约,我希望它在数据库中输入为上午9:34。这还必须考虑到格林尼治标准时间和服务器所在地的夏令时差异,这似乎是一场噩梦。有什么建议吗 另外,如果有帮助的话,我正在使用SQLServer2005 编辑: 让我澄清一件事。此列中的日期

在插入新数据时,是否有一个数据库级函数(触发器或其他什么)可以用来更改DateTime字段?问题是,我正在集成的服务恰好在GMT中发送所有时间(在本例中,是接收到某些信息的时间)

我需要自动更改它以反映db服务器所在时区的时间。例如,如果他们发送给我下午2:34,但我在纽约,我希望它在数据库中输入为上午9:34。这还必须考虑到格林尼治标准时间和服务器所在地的夏令时差异,这似乎是一场噩梦。有什么建议吗

另外,如果有帮助的话,我正在使用SQLServer2005

编辑:


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

创建一个Timestamp类型的字段,该字段将在该行中的任何数据被修改时更新。唉,它实际上是一个相对时间戳,所以它只能用于版本控制。更多信息可在此处找到:
下面的示例应该可以完成这项工作。将ModifiedOn或类似的DateTime字段添加到db表中

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

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

    ModifiedOn = GetDate()
Where ....
你可以创造

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

    CREATE TABLE dbo.YourTable
    ( ........,
      LastModifiedOn DATETIME 
          CONSTRAINT DF_YourTable_LastModifiedOn DEFAULT (GETDATE())
    )
    
  • 更新后的触发器,每当您更新行时,该触发器将
    日期时间
    字段设置为新值

    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
    
使用默认值和触发器,datetime字段
LastModifiedOn
应始终是最新的,并显示上次修改的日期/时间


Marc

这里的另一个选项是使用日历表,将UTC日期和时间映射到本地日期和时间值

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

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

表结构(粒度将满足您的需要):

然而,另一个选项(同样取决于卷)是部署托管程序集。 (有关说明,请参阅本网站,您确实需要更改服务器配置。)


这是我在我的
udf

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)

很好的建议,但我还不确定在我使用的服务更新他们的字段后,我是否会立即更新该字段。如果他们立即发送收到的时间,这将起作用;否则,我将不得不转换他们发送的实际日期时间。这是一个很好的建议,但请查看对我原始帖子的编辑。@marc_希望,触发器将以服务器位置日期时间格式更新日期时间。比如说,如果我想在UTC中显示,它会注意吗?@RJN:使用
SYSUTCDATETIME()
而不是
GETDATE()
来获取UTC时间,并发布新的注释。听起来转换日期时间在托管udf中最容易实现。这可以在insert时的触发器中完成,也可以通过在insert语句中将utc转换为本地日期时间来指定。此udf使用本地计算机的utc偏移量。当然,这取决于对SQL实例启用CLR。
Declare @D datetime
set @D = GetUTCDate()

select @D

select dbo.udf_ConvertUTCDateTime(@D)