#sql #sql-server
#sql #sql-сервер
Вопрос:
У меня есть таблица, в которой есть столбец datetime, в который я хочу вставить несколько записей одновременно. Необходимо, чтобы datetime было точно таким же, чтобы я мог позже сравнить, какие записи были вставлены вместе. Достаточно ли сделать что-то подобное:
INSERT INTO Table(Date, ID, etc...)
VALUES (GETDATE(), ...)
Или я должен объявить переменную ранее в хранимой процедуре для хранения текущего времени и просто использовать ее в качестве значения для вставки.
Я протестировал, и кажется, что первый метод работает нормально, я просто хочу быть уверен на 100%.
Редактировать: Я думаю, что вопрос лучше сформулировать как «Как часто GETDATE() выполняется в хранимой процедуре?»
Ответ №1:
GETDATE()
вычисляется один раз для каждого запроса. Нет необходимости объявлять переменную.
Комментарии:
1. 1 по духу, но у меня закончились голоса. Это лучший ответ, хотя его отсутствие может показаться менее читаемым для тех, кто не знает об этом факте.
2. Если вы используете более одной инструкции insert, каждая из них будет иметь разное значение для
getdate()
.3. @Joe Есть ли гарантия этого или это пример того, как полагаться на детали реализации?
4. @Doug: Вот почему я указал на запрос в своем ответе. И, если быть более точным, он вычисляется один раз для каждого столбца в запросе .
5. @Conrad Frix: Я всегда понимал, что это гарантировано.
Ответ №2:
Да, объявите переменную для хранения текущего времени, если вы хотите использовать этот подход. Вы также можете создать родительскую запись и назначить ей одно datetime, а затем записать родительский идентификатор в дочерние записи. Использование метки DateTime, вероятно, будет работать нормально, но это кажется немного грязным.
Ответ №3:
Сохраните текущее datetime в переменной, а затем используйте его во всех запросах insert.
declare @now datetime
set @now = getdate()
insert into table (datecolumn) values (@now)
ОБНОВЛЕНИЕ: как отметил Джо в принятом ответе, GETDATE()
вычисляется один раз за запрос, что делает ненужным фиксировать его значение в переменной. Но это делает намерение более очевидным и улучшает удобство обслуживания, ИМХО.
Комментарии:
1. как я могу это сделать на c #?
2. Это немного выходит за рамки, но … в C # я бы использовал аналогичный подход, фиксируя DateTime. Теперь в переменную и передайте ее туда, где это необходимо.
Ответ №4:
дата легко переключится на новую миллисекунду или сотую долю — в зависимости от вашей базы данных.
вам следует сохранить одну переменную и использовать ее неоднократно.
Ответ №5:
Несмотря на то, что getdate()
запрос выполняется один раз, мое правило в хранимых процедурах заключается в том, чтобы получить текущую дату / время в начале выполнения хранимой процедуры и сохранить его в datetime
переменной (вызвать ее @dtNow
). Это дает мне согласованное представление о «настоящем моменте» для всего выполнения хранимой процедуры.
Выполнение хранимой процедуры, зависящей от текущей даты, таким образом, чтобы период выполнения охватывал конец дня, научит вас преимуществам этого подхода. Позволяет избежать значительной путаницы при попытке выяснить, почему хранимая процедура завершилась с ошибкой таинственным образом.
Также помогает установить аналогичные переменные для обозначения начала и конца дня для рассматриваемой даты:
declare
@dtNow datetime ,
@dtFrom datetime ,
@dtThru datetime
set @dtNow = current_timestamp
set @dtFrom = convert(datetime,convert(varchar,@dtNow,112),112)
set @dtThru = dateadd(ms,-3,dateadd(day,1,@dtFrom))
Этот метод позволяет фильтровать datetime
значения для сбора данных за текущий день (который на самом деле не обязательно может быть датой выполнения):
select *
from foo
where foo.dtSold between @dtFrom and @dtThru
Это, конечно, все зависит от фактических требований, которые связаны с рассматриваемой проблемой.