Adicionar valor padrão do campo datetime no SQL Server a um carimbo de data e hora


265

Eu tenho uma tabela que coleta formulários enviados em nosso site, mas, por algum motivo, quando eles criaram a tabela, eles não colocaram um carimbo de data / hora na tabela. Quero que ele digite a data e a hora exatas em que o registro foi inserido.

Eu sei que está lá em algum lugar, mas não consigo encontrar como definir o valor padrão (como no Access, você usa getNow()ou Now()), mas não sei onde colocá-lo.


Cuidado com os fusos horários: stackoverflow.com/a/31296917/57475
Tanner

Respostas:


332

Para modificar uma coluna existente em uma tabela existente:

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

2
@TheQ - Obrigado. Eu entendo que eu mude "YourTable" para o nome da minha tabela, mas a parte que eu não entendo é a restrição. O que é uma restrição e eu modificaria seu código para corresponder ao nome da minha tabela?
31411 stephmoreland

TheQA resposta de @steph- pressupõe que você esteja alterando uma coluna existente que não acredito que seja o caso? Veja minha resposta para o código para adicionar uma nova coluna com essa restrição padrão.
Martin Smith

1
Para que uma coluna tenha um valor padrão, ela precisa de uma "restrição padrão" e este comando o adicionará. Você pode nomear a restrição como desejar, o Management Studio geralmente os denomina DF_TableName.
TheQ

@ TheQ - Perfeito, eu vou tentar. Você estava certo, eu já tenho o campo, mas queria aplicar a correção a ele, não criar uma nova. Obrigado por todas as suas respostas!
31411 stephmoreland

6
Se você quiser o carimbo de data / hora UTC em vez da hora local, poderá usar em GETUTCDATE()vez deGETDATE()
Cocowalla

147

Isso também pode ser feito através da GUI do SSMS.

  1. Coloque sua tabela no modo de design (clique com o botão direito na tabela no explorador de objetos-> Design )
  2. Adicione uma coluna à tabela (ou clique na coluna que você deseja atualizar, se ela já existir)
  3. Em Propriedades da Coluna, digite (getdate())no Valor Padrão ou Binding campo como na figura abaixo

Imagem da tabela no modo de design


Boa pergunta. Eu tentaria dateadd(minute, 10, GetDate())ver se isso funciona.
Tony L.

Na exibição do design do servidor sql, eu tentei, diz que o valor deve corresponder a um dos itens da lista! assim que eu fiz-lo no lado back-end
shareef

92

Na tabela do SQL Server, especifique o valor padrão dessa coluna CURRENT_TIMESTAMP. O tipo de dados dessa coluna pode ser datetime ou datetime2.

por exemplo

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

1
Isso falha com a mensagem de erro "Não é possível converter entre [B e TIMESTAMP]". Parece que CURRENT_TIMESTAMP é um valor binário, não uma data e hora.
Sindri Traustason

O TIMESTAMP fornecerá uma entrada como esta: aaaa-mm-dd 00:00:00 UTC; e isso pode tornar o banco de dados tão grande; acho que ele quis dizer apenas a data aaaa-mm-dd; e o valor padrão para ele pode ser definido clicando em "Como Definido como" na vista normal do phpMyAdmin
Amine

@Amine, TIMESTAMP é um valor binário, normalmente usando 6-8 bytes. A representação de string é apenas isso, uma representação, assim como o banco de dados não está armazenando números inteiros como strings. (A menos que você colocar o tempo em uma coluna VARCHAR, e ai ser aqueles que tentativa.)
SilverbackNet

1
Observo que CURRENT_TIMESTAMPretorna um datetimevalor no fuso horário local do computador. Deve ser evitado. Em vez disso, use o SYSUTCDATETIMEque retorna a datetime2no UTC.
Dai19

28

Enquanto a resposta marcada estiver correta com:

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

Você sempre deve estar ciente dos fusos horários ao adicionar valores de data e hora padrão em uma coluna.

Digamos, por exemplo, que esse datetimevalor seja projetado para indicar quando um membro ingressou em um site e você deseja que ele seja exibido novamente para o usuário. GETDATE()Ele fornecerá tempo ao servidor para mostrar discrepâncias se o usuário estiver em um local diferente para o servidor.

Se você espera lidar com usuários internacionais, é melhor em alguns casos usar GETUTCDATE () , que:

Retorna o registro de data e hora do sistema de banco de dados atual como um valor de data e hora. O deslocamento do fuso horário do banco de dados não está incluído. Este valor representa a hora atual do UTC (Tempo Universal Coordenado). Este valor é derivado do sistema operacional do computador no qual a instância do SQL Server está sendo executada.

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

Ao recuperar os valores, o aplicativo / site front-end deve transformar esse valor do horário UTC no local / cultura do usuário que o solicita.


19

Não permitir nulos na coluna e defina um padrão na coluna de 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

Como você alteraria isso para alterar o campo existente "created_date"?
stephmoreland

@steph - Veja Editar. Minha resposta anterior supunha que essa era uma nova coluna. Você precisará proibir NULLs para que o padrão funcione. Como você deseja que as linhas pré-existentes sejam tratadas?
Martin Smith

8

A sintaxe para isso ao criar uma nova tabela é:

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

    CreateDate DATETIME NOT NULL CONSTRAINT DF_MyTable_CreateDate_GETDATE DEFAULT GETDATE()
)

Funciona igualmente bem em uma instrução ALTER TABLE ao adicionar uma nova coluna.
Captain Sensible

7

Isso funciona para mim ...

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

4

Isso também funciona:

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

Ou:

ALTER TABLE EXAMPLE ADD created datetime default GETDATE();

4

Isso funcionou para mim. Estou usando o SQL Developer com Oracle DB:

ALTER TABLE YOUR_TABLE
  ADD Date_Created TIMESTAMP  DEFAULT CURRENT_TIMESTAMP NOT NULL;

2

Para simplificar o seguimento, resumirei as respostas acima:

Digamos que a tabela se chame Customer , tem 4 colunas / menos ou mais ...

você deseja adicionar uma nova coluna à tabela em que toda vez que houver inserção ... essa coluna manterá um registro do horário em que o evento ocorreu.

Solução:

adicione uma nova coluna, digamos que time compra é a nova coluna na tabela com o tipo de dados datetime .

Em seguida, execute o seguinte alter:

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

1

Digamos que você crie uma tabela de banco de dados para um sistema de registro.

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)
);

Agora, algumas pessoas se registram.

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

Então você percebe que precisa de um carimbo de data e hora para quando eles se registraram.

Se esse aplicativo estiver limitado a uma região localizada geograficamente, você poderá usar o horário do servidor local com GETDATE(). Caso contrário, você deve considerar a consideração de Tanner para o público global com GETUTCDATE()o valor padrão.

Adicione a coluna com um valor padrão em uma declaração como esta resposta .

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

Vamos buscar outro registrante e ver como são os dados.

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

No SQLPlus, ao criar uma tabela, é como

SQL> criar tabela Teste

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

SQL> inserir nos valores de Teste (id) (1);

 Test_ID Test_Date
       1 08-MAR-19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.