none
Timestamp x Datetime RRS feed

  • Pergunta

  •  

    Ola pessoal...

     

    Qual a diferenca entre usar como tipo de dados de uma coluna TimeStamp ou DateTime?

     

    Obrigada.

    quarta-feira, 23 de julho de 2008 01:38

Respostas

  • Boa Noite,

     

    Vamos primeiramente conversar no nível ANSI para depois falar do SQL Server.

     

    O ANSI prevê os tipos Date, Time e TimeStamp. O tipo Date armazena somente a Data, o tipo Time somente a hora e o tipo TimeStamp armazena tanto a data quanto a hora. Isso é o que preconiza o ANSI.

     

    No SQL Server não temos o tipo Date o tipo Time. Só temos o tipo DateTime que armazena tanto a data quanto a hora. O tipo DateTime do SQL Server é idêntico ao tipo TIMESTAMP do ANSI.

     

    Mas se o tipo TIMESTAMP do ANSI é idêntico ao tipo DateTime do SQL Server o que significa então o tipo TIMESTAMP do SQL Server ?

     

    Poderíamos pensar que o Timestamp (a "marca de data") seria um sinônimo do DateTime mas isso não é verdade. O TimeStamp do SQL Server é um tipo de dados especial que muda seu valor toda vez que o registro é manipulado (Inserts e Updates somente).

     

    Quando se insere um novo registro, a coluna TimeStamp ganha um valor automaticamente. Quando se atualiza o registro, a coluna TimeStamp automaticamente muda o seu valor. A coluna TimeStamp nada mais é do que uma coluna que toda vez que o registro é "mexido" tem o seu valor alterado. Ela é utilizada para "versionar" a linha uma vez que qualquer alteração na linha, o TimeStamp será alterado. Embora seja uma marcação de data, ele não é exibido como data e não pode ser inserido ou atualizado explicitamente (Inserts e updates especificando o TimeStamp não são permitidos).

     

    E pra que serve então o tal do TimeStamp ?

     

    Essa é uma pergunta que muita gente faz, poucos respondem, alguns que respondem "decoram" que a coluna TimeStamp é utilizada para "controle de concorrência" e apenas uma minoria de fato conhece como o seu funcionamento pode ser utilizado para o controle de concorrência (talvez porque não seja uma situação tão comum assim). De fato quando costumo ministrar as aulas de SQL Server 2005, é comum a indagação da real utilidade desse campo.

     

    Bem, se a explicação convenceu mas você quer algo prático... Consulte o artigo abaixo na qual exemplifico a utilização desse Data Type para resolver um problema mais comum do que parece.

     

    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!143.entry

     

    [ ]s,

     

    Gustavo

     

    PS: No SQL Server 2008 finalmente teremos os tipos Date e Time previstos no ANSI.

    quarta-feira, 23 de julho de 2008 02:27
  • Relmante interessante a explicação do Gustavo.

    Fernanda, se vc der uma procurada sobre timestamp no books online também terá uma resposta bem esclarecedora.

    O Timestamp não se trata de um tipo exato de datatype "Date And Time" (estes são o datetime e o smalldatetime), até se vc olhar nos materiais oficiais (como no próprio books online) a Microsoft não trata ele assim e sim como um tipo entre os "outros tipos de dados".

    Vc não consegue realmente alterá-lo ou inseri-lo numa tabela, ele é criado automaticamente.
    Se vc quiser ver um exemplo do que será gravado na sua tabela na coluna timestamp rode esse SELECT:

     

    Code Snippet
    SELECT
    @@DBTS

     

    Este é um valor exemplo que é colocado numa coluna do tipo timestamp de forma automática.

    Relamente nunca via muita aplicação. Acho q vale a pena conferir o link que o Gustavo lhe passou e também dar uma conferida no que o books online diz a respeito.

     

    Qualquer dúvida estamos à disposição.

     

    [ ]s.

    quarta-feira, 23 de julho de 2008 02:39

Todas as Respostas

  • Boa Noite,

     

    Vamos primeiramente conversar no nível ANSI para depois falar do SQL Server.

     

    O ANSI prevê os tipos Date, Time e TimeStamp. O tipo Date armazena somente a Data, o tipo Time somente a hora e o tipo TimeStamp armazena tanto a data quanto a hora. Isso é o que preconiza o ANSI.

     

    No SQL Server não temos o tipo Date o tipo Time. Só temos o tipo DateTime que armazena tanto a data quanto a hora. O tipo DateTime do SQL Server é idêntico ao tipo TIMESTAMP do ANSI.

     

    Mas se o tipo TIMESTAMP do ANSI é idêntico ao tipo DateTime do SQL Server o que significa então o tipo TIMESTAMP do SQL Server ?

     

    Poderíamos pensar que o Timestamp (a "marca de data") seria um sinônimo do DateTime mas isso não é verdade. O TimeStamp do SQL Server é um tipo de dados especial que muda seu valor toda vez que o registro é manipulado (Inserts e Updates somente).

     

    Quando se insere um novo registro, a coluna TimeStamp ganha um valor automaticamente. Quando se atualiza o registro, a coluna TimeStamp automaticamente muda o seu valor. A coluna TimeStamp nada mais é do que uma coluna que toda vez que o registro é "mexido" tem o seu valor alterado. Ela é utilizada para "versionar" a linha uma vez que qualquer alteração na linha, o TimeStamp será alterado. Embora seja uma marcação de data, ele não é exibido como data e não pode ser inserido ou atualizado explicitamente (Inserts e updates especificando o TimeStamp não são permitidos).

     

    E pra que serve então o tal do TimeStamp ?

     

    Essa é uma pergunta que muita gente faz, poucos respondem, alguns que respondem "decoram" que a coluna TimeStamp é utilizada para "controle de concorrência" e apenas uma minoria de fato conhece como o seu funcionamento pode ser utilizado para o controle de concorrência (talvez porque não seja uma situação tão comum assim). De fato quando costumo ministrar as aulas de SQL Server 2005, é comum a indagação da real utilidade desse campo.

     

    Bem, se a explicação convenceu mas você quer algo prático... Consulte o artigo abaixo na qual exemplifico a utilização desse Data Type para resolver um problema mais comum do que parece.

     

    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!143.entry

     

    [ ]s,

     

    Gustavo

     

    PS: No SQL Server 2008 finalmente teremos os tipos Date e Time previstos no ANSI.

    quarta-feira, 23 de julho de 2008 02:27
  • Relmante interessante a explicação do Gustavo.

    Fernanda, se vc der uma procurada sobre timestamp no books online também terá uma resposta bem esclarecedora.

    O Timestamp não se trata de um tipo exato de datatype "Date And Time" (estes são o datetime e o smalldatetime), até se vc olhar nos materiais oficiais (como no próprio books online) a Microsoft não trata ele assim e sim como um tipo entre os "outros tipos de dados".

    Vc não consegue realmente alterá-lo ou inseri-lo numa tabela, ele é criado automaticamente.
    Se vc quiser ver um exemplo do que será gravado na sua tabela na coluna timestamp rode esse SELECT:

     

    Code Snippet
    SELECT
    @@DBTS

     

    Este é um valor exemplo que é colocado numa coluna do tipo timestamp de forma automática.

    Relamente nunca via muita aplicação. Acho q vale a pena conferir o link que o Gustavo lhe passou e também dar uma conferida no que o books online diz a respeito.

     

    Qualquer dúvida estamos à disposição.

     

    [ ]s.

    quarta-feira, 23 de julho de 2008 02:39
  • Gustavo...

     

    Obrigada pela explicacao...

     

    Vi uma pessoa comentando q o tipo timestamp poderia servir para armazenar a data e hora atual como vc explicou, mas poderia por exemplo ser usado num record onde vc precisa armazenar a data por exemplo q um cliente foi cadastrado, sem entrar com esse dado manualmente...

     

    Isto esta correto?

     

    Obrigada!

    quarta-feira, 23 de julho de 2008 02:46
  • Olá Fernanda,

     

    Se o SQL Server fosse totalmente ANSI Compliance (o que nem um banco jamais será) poderíamos utilizar o tipo TimeStamp para armazenar a data e a hora, mas ainda assim isso não seria preenchido automaticamente. Como o TimeStamp do SQL Server não é o mesmo que o TimeStamp do ANSI esse tipo de dados não pode ser utilizado para isso.

     

    Se você deseja armazenar a data em que o cliente foi cadastrado sem entrar com esse dado manualmente, você deve criar um campo DateTime (ou SmallDateTime) e adicionar um DEFAULT. Ex:

     

    Code Snippet

    CREATE TABLE Cli (Nome VARCHAR(20), DataCadastro DATETIME GETDATE())

     

    INSERT INTO Cli (Nome) VALUES ('Algum Cliente')

     

    SELECT Nome, DataCadastro FROM Cli

     

    Oi Thiago,

     

    No SQL Server realmente o TIMESTAMP não significa um Date + Time. O TimeStamp do ANSI tem essa definição. Como o TimeStamp do SQL Server não é igual ao do ANSI, isso não é verdadeiro para o SQL Server. No próprio Books OnLine você encontrará essa observação da diferença.

     

    "The Transact-SQL timestamp data type is different from the timestamp data type defined in the SQL-2003 standard. The SQL-2003 timestamp data type is equivalent to the Transact-SQL datetime data type."

     

    Não sei se passei outra impressão, mas era exatamente a citação do Books OnLine que eu me referia.

     

    [ ]s,

     

    Gustavo

    quarta-feira, 23 de julho de 2008 04:24
  •  

    uso o timesstamp para controle de auditoria em tabelas especificas, ele e bom para isso;

     

     

    Abs;

    quarta-feira, 23 de julho de 2008 10:21
  • Sim Gustavo, eu havia compreendido a sua explicação.

     

    [ ]s.

    quarta-feira, 23 de julho de 2008 11:55
  • Muito legal como auditoria, porém só me vem a mente ficar recuperando esse valor de timestamp e controlando em alguma outra tabela a auditoria. Seria essa forma ?
    quarta-feira, 16 de março de 2011 04:07