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'))
fonte
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'))
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 tipoMeus 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);
fonte
A maneira mais simples de fazer isso é:
SELECT id,name,FROM_UNIXTIME(registration_date) FROM `tbl_registration`;
Isso dá a coluna de data pelo menos em um formato legível. Além disso, se você deseja alterar o formato clique aqui .
fonte
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
fonte
Explicit conversion from data type timestamp to date is not allowed.
Funciona bem, exceto esta mensagem:
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
fonte
"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.
fonte
Após a implementação da conversão para inteiro CONVERT (BIGINT, [timestamp]) como Timestamp, obtive o resultado como
Sim, esta não é uma data e hora, são números de série
fonte
para mim funciona: TO_DATE ('19700101', 'aaaammdd') + (TIME / 24/60/60) (oracle DB)
fonte
Eu tive o mesmo problema com o carimbo de data / hora, por exemplo: '29 -JUL-20 04.46.42.000000000 PM '. Eu queria transformá-lo no formato 'aaaa-MM-dd'. A solução que finalmente funciona para mim é
SELECT TO_CHAR (mytimestamp, 'YYYY-MM-DD') FROM mytable;
fonte
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):
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
fonte
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.fonte
Por que não tentar
FROM_UNIXTIME(unix_timestamp, format)
?fonte
Não tenho certeza se estou faltando alguma coisa aqui, mas você não pode simplesmente converter o carimbo de data / hora assim:
fonte