1

В моем PHP-сценарии я хочу добавить дату в столбец (типа datetime) в MS SQL Server. Я установил соединение после этого поста в блоге (php5-sybase, php5-odbc, freetds в Ubuntu 14.04/15.10):https://blog.thesysadmins.co.uk/ubuntu-server-connect-to-mssql-via- php.html

Моя проблема заключается в том, что при использовании точно такого же запроса в сценарии php, что и в SQL Management Studio, запрос через PHP не выполняется, поскольку столбец даты интерпретируется как NULL. (Сокращенный) запрос:

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.

Как я уже сказал, точно такой же запрос прекрасно работает в SQL Management Studio. Теперь этот запрос выполняется без ошибок:

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

Очевидно, что datetime в Query интерпретируется как MDY, но я не могу найти никакой возможности изменить это. Удивительно, но он работает под Ubuntu 15.10, но не 14.04, используя тот же конфиг для apache, php. freetds и php5-odbc используют свои значения по умолчанию.

Ни настройки SQL Server (@@ LANGUAGE = Germand, sp_helplanguage German dateformat = dmy), ни php.ini (форматы даты и времени iconv) не настроены в MDY . mssql.datetimeconvert = On не имеет значения для выключения.

tl; dr Как мне сказать PHP, что формат даты и времени не MDY, а DMY?

2 ответа2

1

Основной причиной не было ни PHP, ни freetds, ни какие-либо системные настройки * NIX. Хорошо документированный /etc/freetds/locales.conf для установки формата даты и времени работает нормально.

НО ДЛЯ ДРАЙВЕРА FREETDS ДЛЯ ИНТЕРПРЕТАЦИИ ДАТЫ В УКАЗАННОМ ФОРМАТЕ, ВЫ НЕ ДОЛЖНЫ КОДИРОВАТЬ ЭТО КАК СТРОКА ХАРАКТЕРА В ВАШЕМ ЗАПРОСЕ

Как вы можете видеть выше в моем вопросе, значение для поля типа datetime заключено в одинарные кавычки / галочки. Таким образом, FreeTDS интерпретирует данные как строку (точнее, varchar) и просто передает их на SQL Server. Вот почему запрос не выполняется, потому что SQL-сервер по праву не позволяет вставлять varchars в столбцы datetime.

Почему один и тот же запрос работал в одной версии Ubuntu, но не в другой, я не понимаю.

tl; dr Не используйте кавычки вокруг значений даты и времени в ваших запросах. Мне потребовалось всего 3 месяца, чтобы осознать :)

0

Как указано в комментариях, использование convert() - это обходной путь. Я не специалист по MS SQL. Я в основном использую MySQL. Как бы то ни было, MS SQL datetime использует формат yyyy-mm-dd hh:mm:ss

Существует SET DATEFORMAT для установки порядка частей даты месяца, дня и года для интерпретации строк символов smalldatetime, datetime, datetime2 и datetimeoffset.

SET DATEFORMAT dmy; должен выполнить поставленную задачу

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .