Como definir o formato de data e hora para o driver PHP do SQL Server

0

No meu script PHP, quero adicionar uma data a uma coluna (do tipo datetime) no MS SQL Server. Eu configurei a conexão seguindo este post (php5-sybase, php5-odbc, freetds no Ubuntu 14.04 / 15.10): link

Meu problema é, usando exatamente a mesma consulta em um script PHP como no SQL Management Studio, a consulta via PHP falha, porque a coluna de data é interpretada como NULL. A consulta (abreviada):

INSERT INTO tbl_test (mydate) VALUES (’20-3-2004′)
message: Cannot insert the value NULL into column ‘mydate’ column does not allow nulls. INSERT fails.

Como eu disse, a mesma consulta é executada bem no SQL Management Studio. Agora, esta consulta é executada sem erros:

INSERT INTO tbl_test (mydate) VALUES (’3-20-2004′)

Obviamente , o datetime na Consulta é interpretado como M-D-Y , mas não consigo encontrar nenhuma opção para alterar isso. Surpreendentemente, ele funciona no Ubuntu 15.10, mas não no 14.04, usando a mesma configuração para o apache, php. freetds e php5-odbc usam seus valores padrão.

Nenhuma das configurações do SQL Server (@@ LANGUAGE = Germand, sp_helplanguage alemão dateformat = dmy) nem php.ini (formatos de datetime iconv) tem M-D-Y configurado. mssql.datetimeconvert = Ativado não faz diferença em estar desativado.

tl; dr Como posso dizer ao PHP que o formato datetime não é MDY, mas DMY?

    
por NoMad 09.09.2016 / 08:46

2 respostas

0

A causa raiz não foi PHP, nem freetds, nem qualquer configuração do sistema * NIX. O bem documentado /etc/freetds/locales.conf para definir o formato datetime funciona bem.

MAS PARA O DRIVER FREETDS INTERPRETAR DATAS NO FORMATO ESPECIFICADO, VOCÊ NÃO DEVE CODIFICAR-SE COMO UMA CADEIA DE CARACTERES NA SUA CONSULTA

Como você pode ver acima na minha pergunta, o valor para o campo do tipo datetime é colocado entre aspas simples / carrapatos. Dessa forma, o FreeTDS interpreta os dados como uma String (varchar para ser preciso) e apenas os transmite no SQL Server. É por isso que a consulta falha, porque o SQL Server não permite que varchars sejam inseridos em colunas datetime.

Por que exatamente a mesma consulta funcionou em uma versão do Ubuntu, mas a outra não está além da minha compreensão.

tl; dr Não use aspas em torno dos valores de data e hora em suas consultas. Demorei apenas 3 meses para perceber:)

    
por 22.09.2016 / 14:04
0

Como apontado nos comentários usando convert () é uma solução alternativa. Eu não sou especialista em MS SQL. Eu principalmente uso o MySQL. No entanto, olhando para cima, o datetime do MS SQL usa o formato yyyy-mm-dd hh:mm:ss

SET DATEFORMAT para definir o pedido do mês, dia e ano data partes para interpretar strings de caracteres date, smalldatetime, datetime, datetime2 e datetimeoffset.

SET DATEFORMAT dmy; deve executar a tarefa que você precisa

    
por 09.09.2016 / 11:19