Много причин:
You could create
a default value for the DateTime
which gets set when you insert a new record
CREATE TABLE dbo.YourTable
( ........,
LastModifiedOn DATETIME
CONSTRAINT DF_YourTable_LastModifiedOn DEFAULT (GETDATE())
)
a AFTER UPDATE TRIGGER which sets the DateTime
field to the new value whenever you've updated your row
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
With the default value and the trigger, your datetime field LastModifiedOn
should always be up to date and showing the last modification date/time.
Marc
Создайте поле типа «Отметка времени», которое будет обновляться при изменении любых данных в этой строке. Увы, это буквально относительная временная метка, поэтому ее можно использовать только для управления версиями. Более подробную информацию можно найти здесь: http://msdn.microsoft.com/en-us/library/ms182776(SQL.90).aspx
Следующий пример должен работать. Добавьте ModifiedOn или подобное поле DateTime в вашу таблицу базы данных.
insert into foo (field1, field2, ...., ModifiedOn)
values (value1, value2,...., GetDate())
или для обновления
update Foo
set field1 = value1,
field2 = value2,
.
.
.
.,
ModifiedOn = GetDate()
Where ....
Другой вариант - использовать календарную таблицу, в которой вы сопоставляете дату и время UTC с местными значениями даты и времени.
Недостатками здесь являются потеря некоторой степени детализации. Если секунды важны, я бы не стал реализовывать это; вы можете посмотреть размер календарной записи и сравнить его с размером хранения datetime для каждой записи в вашей транзакционной таблице. Очевидно, что чем меньше объем, тем менее выгодным будет это решение. Кроме того, если вы не встраиваете автоматическое и автоматическое повторное заполнение будущих записей в решении, в таблице «закончатся» записи, и вы оставите бомбу замедленного действия для всех, кто придет после вас (может быть, и для вас самих).
Однако преимущества заключаются в том, что вы сможете выполнять любые запросы к этой таблице гораздо быстрее (поскольку это целое число). Также, если вы когда-нибудь решите, что вашему серверу в Нью-Йорке необходимо переехать в Сакраменто, вы можете обновить « 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
Еще другой вариант (опять же в зависимости от объема) - развернуть управляемую сборку. (инструкции см. на этом сайте, вам необходимо изменить конфигурацию сервера. Как реализовать управляемый udf или sp )
Вот C #, который я поместил в свой 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)