Добавить значение по умолчанию поля даты и времени в SQL Server к отметке времени


265

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

Я знаю, что где-то там, но я не могу найти способ установить значение по умолчанию (как в Access, вы используете getNow()или Now()), но я не знаю, где его поставить.


Остерегайтесь часовых
Таннер

Ответы:


332

Для изменения существующего столбца в существующей таблице:

ALTER TABLE YourTable ADD CONSTRAINT DF_YourTable DEFAULT GETDATE() FOR YourColumn

2
@TheQ - Спасибо. Я получаю, что я заменяю «YourTable» на имя моей таблицы, но часть, которую я не понимаю, - «Ограничение». Что такое ограничение, и могу ли я изменить ваш код в соответствии с именем моей таблицы?
Stephmoreland

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

1
Чтобы столбец имел значение по умолчанию, ему нужно «ограничение по умолчанию», и эта команда добавит его. Вы можете назвать ограничение как угодно, Management Studio обычно называет их DF_TableName.
TheQ

@TheQ - Отлично, я попробую. Вы были правы, у меня уже есть поле, но я хотел применить к нему исправление, а не создавать новое. Спасибо за все ваши ответы!
Stephmoreland

6
Если вы хотите использовать метку времени UTC вместо местного времени, вы можете использовать GETUTCDATE()вместоGETDATE()
Cocowalla

147

Это также можно сделать через графический интерфейс SSMS.

  1. Поместите вашу таблицу в дизайн-представление (щелкните правой кнопкой мыши по таблице в проводнике объектов-> Дизайн )
  2. Добавьте столбец в таблицу (или щелкните столбец, который вы хотите обновить, если он уже существует)
  3. В свойствах столбца введите значение (getdate())по умолчанию или поле привязки, как показано ниже

Изображение таблицы в режиме конструктора


Хороший вопрос. Я бы попробовал dateadd(minute, 10, GetDate())посмотреть, работает ли это.
Тони Л.

В представлении SQL Server Design я попробовал, он говорит, что значение должно соответствовать одному из элементов в списке! так что я сделал это на задней стороне
Шариф

92

В этой таблице в SQL Server укажите значение по умолчанию для этого столбца CURRENT_TIMESTAMP. Тип данных этого столбца может быть datetime или datetime2.

например

Create Table Student
(
  Name varchar(50),
  DateOfAddmission datetime default CURRENT_TIMESTAMP
);

1
Это происходит с сообщением об ошибке «Невозможно выполнить преобразование между [B и TIMESTAMP]». Кажется, CURRENT_TIMESTAMP - это двоичное значение, а не дата и время.
Синдри Траустасон

TIMESTAMP предоставит вам следующий ввод: yyyy-mm-dd 00:00:00 UTC; и это может сделать БД такой большой; я думаю, что он имел в виду только дату гггг-мм-дд; и значение по умолчанию для него можно установить, щелкнув «Как определено как» в обычном представлении phpmyadmin
Amine

@Amine, TIMESTAMP - это двоичное значение, обычно использующее 6-8 байтов. Строковое представление - это просто представление, точно так же, как база данных не хранит целые числа в виде строк. (Если вы не поместите время в столбец VARCHAR, и горе тем, кто пытается.)
SilverbackNet

1
Отмечу, что CURRENT_TIMESTAMPвозвращает datetimeзначение в местном часовом поясе компьютера. Этого следует избегать. Вместо этого используйте, SYSUTCDATETIMEкоторый возвращает datetime2в UTC.
Дай

28

Пока помеченный ответ правильный с:

ALTER TABLE YourTable ADD CONSTRAINT DF_YourTable DEFAULT GETDATE() FOR YourColumn

При добавлении значений даты и времени по умолчанию в столбец всегда следует помнить о часовых поясах.

Скажем, например, что это datetimeзначение предназначено для указания того, когда участник присоединился к веб-сайту, и вы хотите, чтобы оно отображалось обратно пользователю, GETDATE()даст вам время сервера, поэтому может показывать расхождения, если пользователь находится в другой локали сервера.

Если вы планируете иметь дело с международными пользователями, в некоторых случаях лучше использовать GETUTCDATE () , которая:

Возвращает текущую системную метку базы данных в качестве значения даты и времени. Смещение часового пояса базы данных не включено. Это значение представляет текущее время UTC (Всемирное координированное время). Это значение получено из операционной системы компьютера, на котором работает экземпляр SQL Server.

ALTER TABLE YourTable ADD CONSTRAINT DF_YourTable DEFAULT GETUTCDATE() FOR YourColumn

При получении значений интерфейсное приложение / веб-сайт должны преобразовать это значение из времени UTC в языковой стандарт / язык пользователя, запрашивающего его.


19

Запретить пустые значения в столбце и установить значение по умолчанию для столбца getdate()

/*Deal with any existing NULLs*/
UPDATE YourTable SET created_date=GETDATE() /*Or some sentinel value 
                                                '19000101' maybe?*/
WHERE created_date IS NULL


/*Disallow NULLs*/
ALTER TABLE YourTable ALTER COLUMN created_date DATE NOT NULL

/*Add default constraint*/
ALTER TABLE YourTable ADD CONSTRAINT
    DF_YourTable_created_date DEFAULT GETDATE() FOR created_date

Как бы вы изменили это, чтобы изменить существующее поле «create_date»?
Stephmoreland

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

8

Синтаксис этого при создании новой таблицы:

CREATE TABLE MyTable
(
    MYTableID INT IDENTITY(1,1),

    CreateDate DATETIME NOT NULL CONSTRAINT DF_MyTable_CreateDate_GETDATE DEFAULT GETDATE()
)

Он одинаково хорошо работает в операторе ALTER TABLE при добавлении нового столбца.
Капитан Разумный

7

Это работает для меня ...

ALTER TABLE [accounts] 
 ADD [user_registered] DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ;

4

Это также работает:

CREATE TABLE Example(
...
created datetime default GETDATE()
);

Или:

ALTER TABLE EXAMPLE ADD created datetime default GETDATE();

4

Это сработало для меня. Я использую SQL Developer с Oracle DB:

ALTER TABLE YOUR_TABLE
  ADD Date_Created TIMESTAMP  DEFAULT CURRENT_TIMESTAMP NOT NULL;

2

Чтобы было проще следовать, я обобщу приведенные выше ответы:

Допустим, таблица называется Customer, она имеет 4 столбца / меньше или больше ...

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

Решение:

добавьте новый столбец, скажем, timepurchase - новый столбец, в таблицу с типом данных datetime .

Затем выполните следующее изменение:

ALTER TABLE Customer ADD CONSTRAINT DF_Customer DEFAULT GETDATE() FOR timePurchase

1

Допустим, вы создали таблицу базы данных для системы регистрации.

IF OBJECT_ID('dbo.registration_demo', 'U') IS NOT NULL 
  DROP TABLE dbo.registration_demo; 

CREATE TABLE dbo.registration_demo (
    id INT IDENTITY PRIMARY KEY,
    name NVARCHAR(8)
);

Сейчас пара человек регистрируется.

INSERT INTO dbo.registration_demo (name) VALUES
    ('John'),('Jane'),('Jeff');

Затем вы понимаете, что вам нужна временная метка, когда они регистрируются.

Если это приложение ограничено географически локализованным регионом, то вы можете использовать время локального сервера с GETDATE(). В противном случае вы должны прислушаться к мнению Таннера о глобальной аудитории с GETUTCDATE()использованием значения по умолчанию.

Добавьте столбец со значением по умолчанию в одном утверждении, как этот ответ .

ALTER TABLE dbo.registration_demo
ADD time_registered DATETIME DEFAULT GETUTCDATE();

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

INSERT INTO dbo.registration_demo (name) VALUES
    ('Julia');

SELECT * FROM dbo.registration_demo;
id    name    time_registered
1     John    NULL
2     Jane    NULL
3     Jeff    NULL
4     Julia   2016-06-21 14:32:57.767

0

В SQLPlus при создании таблицы это выглядит как

SQL> создать таблицу Test

 ( Test_ID number not null,
   Test_Date date default sysdate not null );

SQL> вставить в Test (id) значения (1);

 Test_ID Test_Date
       1 08-MAR-19
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.