Додайте до часової позначки значення поля datetime у SQL Server


265

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

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


Остерігайтесь часових поясів: stackoverflow.com/a/31296917/57475
Таннер

Відповіді:


332

Для зміни існуючого стовпця в існуючій таблиці:

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

2
@TheQ - Дякую Я розумію, що я змінюю "YourTable" на своє ім'я таблиці, але частина, яку я не розумію, є обмеженням. Що таке обмеження, і чи можу я змінити ваш код, щоб він відповідав імені моєї таблиці?
stephmoreland

Відповідь @steph - TheQпередбачає, що ви змінюєте існуючий стовпець, який, на мою думку, не так? Дивіться мою відповідь щодо коду, щоб додати новий стовпець із цим обмеженням за замовчуванням.
Мартін Сміт

1
Для того, щоб стовпець мав значення за замовчуванням, йому потрібно "обмеження за замовчуванням", і ця команда додасть це. Ви можете назвати обмеження як завгодно, студія управління зазвичай називає їх DF_TableName.
TheQ

@TheQ - Це ідеально, я спробую. Ви мали рацію, у мене вже є поле, але я хотів застосувати виправлення до нього, а не створювати нове. Дякую за всі ваші відповіді!
stephmoreland

6
Якщо ви хочете GETUTCDATE()GETDATE()
позначку

147

Це також можна зробити через графічний інтерфейс SSMS.

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

Зображення таблиці в дизайні подання


Гарне питання. Я б спробував dateadd(minute, 10, GetDate())побачити, чи це працює.
Тоні Л.

У поданні дизайну сервера sql я спробував це, мовляв, значення повинно відповідати одному з елементів у списку! таким чином я зробив це на задньому торці
shareef

92

У цій таблиці на SQL сервері вкажіть значення за замовчуванням для цього стовпця CURRENT_TIMESTAMP. Тип даних цього стовпця може бути датою або датою2.

напр

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

1
Це не вдається з повідомленням про помилку "Неможливо перетворити між [B і TIMESTAMP]". Здається, CURRENT_TIMESTAMP - це двійкове значення, а не час дати.
Sindri Traustason

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

Як би ви змінили це, щоб змінити існуюче поле "created_date"?
stephmoreland

@steph - Див. Редагувати. Моя попередня відповідь передбачала, що це нова колонка. Вам потрібно буде заборонити NULLs для роботи за замовчуванням, так як ви хочете обробляти попередні рядки?
Мартін Сміт

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

Щоб зробити це простішим, я підсумую наведені вище відповіді:

Скажімо, таблиця називається Клієнт, вона має 4 стовпчики / менше або більше ...

ви хочете додати новий стовпець до таблиці, де кожен раз, коли є вставка ..., тоді цей стовпець зберігає запис про час, що відбулася подія.

Рішення:

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

Потім запустіть наступний alter:

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_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.