Usuário com melhor resposta
Timestamp x Datetime

Pergunta
-
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.
-
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 SnippetSELECT @@DBTSEste é 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.
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.
-
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 SnippetSELECT @@DBTSEste é 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.
-
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!
-
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 SnippetCREATE 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
-
-
-