是否有插入新数据时可用于更改DateTime字段的数据库级功能(触发器或其他内容)?问题在于,我正在整合的服务恰好在GMT中发送所有时间(在这种情况下是在他们的结尾收到一些信息的时间)。
我需要自动更改此值以反映数据库服务器所在时区的时间。例如,如果他们在下午2:34发送给我,但我在纽约,我希望将其输入数据库上午9:34。这也需要考虑GMT和服务器之间的夏令时差异,这似乎是一场噩梦。有什么建议吗?
此外,如果有帮助,我正在使用SQL Server 2005.
编辑:
让我澄清一件事。每隔一段时间(5,10,15分钟)批量检索进入此列的日期,因此我认为唯一的方法是在收到时更改时间,而不是添加TimeModified字段或其他内容。这甚至可行吗?
答案 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
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 ....