Como o SQL Server retorna timestamp como 'Nov 14 2011 03:12:12:947PM'
, há alguma maneira fácil de converter string em formato de data como 'Ymd H: i: s'.
Até agora eu uso
date('Y-m-d H:i:s',strtotime('Nov 14 2011 03:12:12:947PM'))
Respostas:
O TIMESTAMP
tipo de dados do SQL Server não tem nada a ver com data e hora!
É apenas uma representação hexadecimal de um número inteiro consecutivo de 8 bytes - é bom apenas para garantir que uma linha não mudou desde que foi lida.
Você pode ler o número inteiro hexadecimal ou, se quiser, um BIGINT
. Como um exemplo:
SELECT CAST (0x0000000017E30D64 AS BIGINT)
O resultado é
400756068
Nas versões mais recentes do SQL Server, ele é chamado RowVersion
- já que é realmente o que é. Veja os documentos do MSDN em ROWVERSION :
É um tipo de dados que expõe números binários exclusivos gerados automaticamente em um banco de dados. rowversion é geralmente usado como um mecanismo para linhas de tabela de carimbo de versão. O tipo de dados rowversion é apenas um número crescente e não preserva uma data ou hora . Para registrar uma data ou hora, use um tipo de dados datetime2.
Portanto, você não pode converter um SQL Server TIMESTAMP
em uma data / hora - simplesmente não é uma data / hora.
Mas se você está dizendo timestamp, mas na verdade quer dizer uma DATETIME
coluna - então você pode usar qualquer um desses formatos de data válidos descritos em CAST e CONVERT tópico na ajuda do MSDN. Esses são definidos e suportados "fora da caixa" pelo SQL Server. Qualquer outra coisa não é suportada, por exemplo, você tem que fazer muita conversão manual e concatenação (não recomendado).
O formato que você está procurando se parece um pouco com o ODBC canônico (estilo = 121):
DECLARE @today DATETIME = SYSDATETIME()
SELECT CONVERT(VARCHAR(50), @today, 121)
dá:
2011-11-14 10:29:00.470
O SQL Server 2012 finalmente terá uma FORMAT
função para fazer a formatação personalizada ......
TIMESTAMP
colunas de tipo
Meus colegas de trabalho me ajudaram com isso:
select CONVERT(VARCHAR(10), <tms_column>, 112), count(*)
from table where <tms_column> > '2012-09-10'
group by CONVERT(VARCHAR(10), <tms_column>, 112);
ou
select CONVERT(DATE, <tms_column>, 112), count(*)
from table where <tms_column> > '2012-09-10'
group by CONVERT(DATE, <tms_column>, 112);
Usando o elenco, você pode obter a data de um campo de carimbo de data / hora:
SELECT CAST(timestamp_field AS DATE) FROM tbl_name
Explicit conversion from data type timestamp to date is not allowed.
Funciona bem, exceto esta mensagem:
A conversão implícita do tipo de dados varchar em timestamp não é permitida. Use a função CONVERTER para executar esta consulta
Então, sim, TIMESTAMP
( RowVersion
) NÃO é uma DATA :)
Para ser honesto, eu mesmo fiquei mexendo por um bom tempo para encontrar uma maneira de convertê-lo em um encontro.
A melhor maneira é convertê-lo INT
e compará-lo. É isso que esse tipo deve ser.
Se você quiser um encontro - basta adicionar uma Datetime
coluna e viver feliz para sempre :)
saúde mac
"Você continua usando essa palavra. Não acho que signifique o que você pensa que significa." - Inigo Montoya
O carimbo de data / hora não tem absolutamente nenhuma relação com o tempo, como marc_s disse originalmente.
declare @Test table (
TestId int identity(1,1) primary key clustered
,Ts timestamp
,CurrentDt datetime default getdate()
,Something varchar(max)
)
insert into @Test (Something)
select name from sys.tables
waitfor delay '00:00:10'
insert into @Test (Something)
select name from sys.tables
select * from @Test
Observe na saída que Ts (hex) é incrementado em um para cada registro, mas o tempo real tem um intervalo de 10 segundos. Se fosse relacionado ao tempo, haveria uma lacuna no carimbo de data / hora para corresponder à diferença no tempo.
Após a implementação da conversão para inteiro CONVERT (BIGINT, [timestamp]) como Timestamp, obtive o resultado como
446701117 446701118 446701119 446701120 446701121 446701122 446701123 446701124 446701125 446701126
Sim, esta não é uma data e hora, são números de série
para mim funciona: TO_DATE ('19700101', 'aaaammdd') + (TIME / 24/60/60) (oracle DB)
Vou supor que você fez um despejo de dados como instruções de inserção e você (ou quem quer que faça isso no Google) está tentando descobrir a data e hora, ou traduzi-lo para uso em outro lugar (por exemplo: para converter para inserções do MySQL). Na verdade, isso é fácil em qualquer linguagem de programação.
Vamos trabalhar com isso:
CAST(0x0000A61300B1F1EB AS DateTime)
Esta representação hexadecimal é, na verdade, dois elementos de dados separados ... Data e hora. Os primeiros quatro bytes são de data, os segundos quatro bytes são de tempo.
Converta ambos os segmentos em inteiros usando a linguagem de programação de sua escolha (é uma conversão direta de hex para inteiros, que é suportada em todas as linguagens de programação modernas, portanto, não vou perder espaço com código que pode ou não ser a linguagem de programação você está trabalhando).
Agora, o que fazer com esses inteiros:
Encontro
A data é desde 01/01/1900 e é representada como dias. Portanto, adicione 42.515 dias a 01/01/1900 e seu resultado será 27/05/2016.
Tempo
O tempo é um pouco mais complexo. Pegue esse INT e faça o seguinte para obter o seu tempo em microssegundos desde a meia-noite (pseudocódigo):
TimeINT=Hex2Int(HexTime)
MicrosecondsTime = TimeINT*10000/3
A partir daí, use as chamadas de função favoritas do seu idioma para traduzir microssegundos (38872676666,7 µs no exemplo acima) em tempo.
O resultado seria 10: 47: 52.677
Alguns deles realmente se convertem em uma data e hora do SQL Server 2008 em diante.
Experimente a seguinte consulta SQL e você verá por si mesmo:
SELECT CAST (0x00009CEF00A25634 AS datetime)
O resultado acima resultará em, 2009-12-30 09:51:03:000
mas eu encontrei alguns que, na verdade, não são mapeados para uma data e hora.
Por que não tentar FROM_UNIXTIME(unix_timestamp, format)
?
Não tenho certeza se estou faltando alguma coisa aqui, mas você não pode simplesmente converter o carimbo de data / hora assim:
CONVERT(VARCHAR,CAST(ZEIT AS DATETIME), 110)