2013-07-10 2 views
-1

У меня есть следующая таблицаTSQL DEFAULT CURRENT_TIMESTAMP

CREATE TABLE T3 
(
    DD DATETIME DEFAULT CURRENT_TIMESTAMP 
) 

При запуске для вставки строк в T3 через это:

INSERT T3 SELECT 1; 

я

1900-01-02 00:00:00.000 
1900-01-02 00:00:00.000 
1900-01-02 00:00:00.000 
1900-01-02 00:00:00.000 

Почему значения в год 1900?

Я использую sql server express 2012. Часы на моей машине текущие.

+0

Что вы ожидаете, что поведение этого заявления должен был быть? Попытка понять мышление за «SELECT 1» в первую очередь. –

+0

erm Что вы думаете по умолчанию current_timestamp? –

+0

Почему я получил -2? Я сделал что-то против рекомендаций stackoverflow? –

ответ

4

Ваш INSERT T3 без явного списка столбцов ожидает источник значений для вставки, который содержит значение для каждого столбца в таблице, кроме IDENTITY/ROWVERSION или вычисленных столбцов.

В вашей таблице есть один такой столбец, а источник предложения SELECT поставляет один столбец. Таким образом, результат заключается в том, что вы вставляете явное целочисленное значение 1 в столбец DD.

Этот тип данных столбца - datetime, требующий неявного литья. Результат SELECT CAST(1 AS DATETIME) равен 1900-01-02, следовательно, результаты, которые вы видите.

Наследие datetime позволяют неявные типы данных слепки с int и float и обрабатывать числовые значения, как дни, так как 1900-01-01. Новейшие типы данных, такие как datetime2, не поддерживают эти неявные выражения и вместо этого будут вызывать ошибку.

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

В вашем случае вы можете сделать это либо

INSERT T3 DEFAULT VALUES; 

Или

INSERT T3 (DD) VALUES (DEFAULT) 
+2

И «День 0» в SQL Server - 1900-01-01 - таким образом, вставка результатов «1» в 1900-01-02 –

Смежные вопросы