Rujj Ответов: 3

Удерживайте сервер datetime в течение нескольких дней


Я управляю ASP.NET приложение MVC с SQL Server 2012 на сервере, и всякий раз, когда запись вставляется, текущая дата-время вставляется в таблицу.

Для некоторых столбцов значение по умолчанию было установлено в getdate (), а для некоторых столбцов оно получается из приложения по DateTime.Now ().

Поэтому рассматривайте сегодняшнюю дату как 2017/03/21 11:00 утра, когда данные вставлены, это займет это время, но когда данные вставлены завтра (2017/03/22 11: 00 утра), они должны вставить ту же дату и время, что и 2017/03/21 11:00 утра.

И через несколько дней я снова смогу получать текущую дату и время всякий раз, когда данные вставляются в таблицу. Может ли это быть достигнуто на уровне базы данных или сервера?

Заранее спасибо.

Что я уже пробовал:

Я пытаюсь изменить хранимую процедуру и значения по умолчанию, установленные в таблице.
Но я пытаюсь найти для этого какое-то более осуществимое решение, поэтому мне не нужно ничего менять в базе данных или приложении.

Кроме того, я могу остановить синхронизацию серверного времени из другого домена .

CHill60

Вы подразумеваете, что не хотите изменять существующие значения столбцов по умолчанию и не хотите изменять приложение, чтобы прекратить предоставление даты и времени?

Rujj

Да, потому что через несколько дней я вернусь к настройкам по умолчанию.

ZurdoDev

Просто напишите какой-нибудь код, чтобы сделать это. Где ты застрял?

_Asif_

Меня больше интересует то, что вызвало поведение желания

3 Ответов

Рейтинг:
20

CHill60

В предыдущей работе мы использовали аналогичный механизм по дате только для того, чтобы заставить действовать конкретный рабочий день. Мы использовали его в чрезвычайных ситуациях и в тестовой среде.

Один из способов добиться чего-то подобного-сохранить переопределение datetime в какой-то постоянной таблице данных.

create table FixedDate
(
	FixedDate DateTime
)
INSERT INTO FixedDate VALUES (cast('2016-01-01 11:15:10' as datetime))

Я использовал очень простой стол:
create table DemoDate
(
	id int identity(1,1),
	DateToRecord DateTime,
	SomeOtherData nvarchar(125)
)

Создайте триггер в целевой таблице, который запрашивает Fixeddate и использует его, если он доступен, в противном случае использует текущую дату и время.
IF OBJECT_ID('TRG_DemoDate') IS NOT NULL
DROP TRIGGER TRG_DemoDate
GO

CREATE TRIGGER TRG_DemoDate ON dbo.DemoDate
AFTER INSERT AS
BEGIN
	DECLARE @fdate DATETIME = (SELECT FixedDate FROM FixedDate)
	IF @fdate IS NULL SET @fdate = GETDATE()

	UPDATE D SET DateToRecord = @fdate
	FROM DemoDate D
	INNER JOIN INSERTED I ON D.id=I.id
END
GO

Затем я запустил следующие запросы (ожидаемые результаты приведены в комментариях)
-- Date will be provided from FixedDate
INSERT INTO DemoDate (SomeOtherData) VALUES('asdfasdlf')
-- Date provided will be overridden
INSERT INTO DemoDate (SomeOtherData, DateToRecord ) VALUES('11111asdfasdlf', GETDATE()) 
-- Date will be set to GETDATE()
DELETE FROM FixedDate
INSERT INTO DemoDate (SomeOtherData) VALUES('22222asdfasdlf')
-- Date provided will be overridden
INSERT INTO DemoDate (SomeOtherData, DateToRecord ) VALUES('33333asdfasdlf', CAST('2017-01-01 11:11:11' as datetime) )
SELECT * FROM DemoDate
Таковы были результаты:
1	2016-01-01 11:15:10.000	asdfasdlf
2	2016-01-01 11:15:10.000	11111asdfasdlf
3	2017-03-21 12:21:11.033	22222asdfasdlf
4	2017-03-21 12:21:11.043	33333asdfasdlf

Обратите внимание, что в моем примере любая дата-время, предоставленная во время вставки, полностью переопределяется правилами в триггере. Если вы хотите сохранить предоставленную дату, когда fixeddate "выключен", то вам также нужно будет проверить наличие даты уже во вставленной таблице.

Чтобы "выключить" фиксированную дату, просто удалите данные из таблицы постоянных данных
DELETE FROM FixedDate


Рейтинг:
2

Slacker007

Добавьте новый столбец для даты переопределения, если ваше требование требует, чтобы ваши входные даты были гибкими. Возможно, вам придется соответствующим образом скорректировать свою кодовую базу. Вы не должны возиться с созданными и измененными столбцами дат в вашей таблице, поскольку они, так сказать, являются источниками истины.


Рейтинг:
1

OriginalGriff

Нет встроенного способа сделать это, вам нужно будет сделать это в вашем программном обеспечении C# или VB. Проблема в том, что только вы знаете, когда дата должна быть "переопределена" таким образом, и нет никакого механизма, чтобы сделать это за вас.

Поэтому разработайте правила, когда это должно - и не должно-быть сделано, и реализуйте их в своем коде C# или VB. Мы не можем сделать это для вас, мы понятия не имеем, каковы могут быть ваши правила - и это очень странное требование!