Как изменить поле DateTime, когда оно обновляется?

Много причин:

  • uint не CLS-совместим, таким образом делание созданного в типе (массив), зависящий от него, было бы проблематично
  • , время выполнения, как первоначально разработано запрещает любой объект на "куче", занимающей больше чем 2 ГБ памяти. Так как максимальный размерный массив, который был бы меньше чем или равный этому пределу, будет новым байтом [интервал. MaxValue] это было бы озадачивающим людям, чтобы смочь генерировать положительные но недопустимые длины массива.
  • Исторически C# наследовал большую часть своего синтаксиса и конвенции от C и C++. В тех массивах просто адресная арифметика с указателями, таким образом, отрицательная индексация массива была возможна (хотя обычно недопустимый и опасный). Так как много существующего кода предполагает, что индекс массива подписывается, это было бы фактором
  • На связанной ноте, использование целых чисел со знаком для индексов массива в C/C++ означает, что interop с этими языками и неуправляемыми функциями потребовал бы использования ints при тех обстоятельствах так или иначе, которые могут перепутать из-за несоответствия.
  • реализация BinarySearch (очень полезный компонент многих алгоритмов) полагается на способность использовать отрицательный диапазон интервала, чтобы указать, что значение не было найдено и местоположение, в котором такое значение должно быть вставлено для поддержания сортировки.
  • При работе на массив вероятно, что Вы хотели бы взять отрицательное смещение существующего индекса. При использовании смещения, которое взяло бы Вас мимо запуска массива с помощью единицы затем, переносить поведение сделало бы индекс возможно законным (в котором это положительно). С интервалом результат был бы недопустим (но безопасен, так как время выполнения примет меры против чтения недопустимой памяти)

7
задан Raggedtoad 10 December 2009 в 18:40
поделиться

4 ответа

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

16
ответ дан 6 December 2019 в 11:49
поделиться

Создайте поле типа «Отметка времени», которое будет обновляться при изменении любых данных в этой строке. Увы, это буквально относительная временная метка, поэтому ее можно использовать только для управления версиями. Более подробную информацию можно найти здесь: http://msdn.microsoft.com/en-us/library/ms182776(SQL.90).aspx

0
ответ дан 6 December 2019 в 11:49
поделиться

Следующий пример должен работать. Добавьте ModifiedOn или подобное поле DateTime в вашу таблицу базы данных.

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

или для обновления

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

    ModifiedOn = GetDate()
Where ....
0
ответ дан 6 December 2019 в 11:49
поделиться

Другой вариант - использовать календарную таблицу, в которой вы сопоставляете дату и время 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)
1
ответ дан 6 December 2019 в 11:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: