pdo_sqlsrv и формат даты с Laravel

Я давно хотел попробовать Laravel, поэтому потратил полдня на его настройку.

В Windows я установил: WAMP 32-разрядную версию с PHP 5.4, Драйверы SQL Server 3.0 от Microsoft (поэтому я использую 32-разрядную версию WAMP) и Composer.

Затем я создал проект, скачал Laravel и генераторы. Я создал скаффолд, чтобы посмотреть, какой код он генерирует, и протестировать его.

Мое первое действие «создать» не удалось из-за ошибки преобразования nvarchar в datetime. Я вставил запрос в SQL Server Management Studio (SSMS) и запустил его с теми же результатами.

Ошибка возникает из-за формата даты. Laravel выразился так: «2013-12-17 16:55:124». Но перед запросом отправляет какой-то набор на SQL Server, и один очень интересный:

set dateformat dmy

Для меня set dateformat dmy означает, что ожидается такая дата: "17-12-2013 16:55:124"

В SSMS изменение установленного формата даты на:

set dateformat ymd

или изменение формата даты в запросе заставляет его работать.

Я не думаю, что это ошибка. Я просто думаю, что что-то неправильно настроено. Я просто не знаю, что.


person elfif    schedule 17.12.2013    source источник


Ответы (2)


Наконец-то я нашел обходной путь, который кажется довольно чистым. Хитрость заключается в том, чтобы заставить Laravel использовать datetime2 вместо datetime с SQL Server.

Для этого вам необходимо внести следующие изменения:

В Illuminate/Database/Schema/Grammars/SqlServerGrammar.php

protected function typeDateTime(Fluent $column)
{
    return 'datetime'; // Change to datetime2
}

А также

protected function typeTimestamp(Fluent $column)
{
    return 'datetime'; // Change to datetime2
}

Затем в Illuminate/Database/Query/Grammars/SqlServerGrammar.php:

public function getDateFormat()
{
    return 'Y-m-d H:i:s.000'; // change to 'Y-m-d H:i:s.0000000'
}

Я надеюсь, что это поможет кому-то...

person elfif    schedule 18.12.2013
comment
Здравствуйте, я согласен с вами, но моему ответу 4 года, и проблема была в Laravel 4. Плюс я сделал PR на laravel, так что это было исправлено давным-давно. - person elfif; 28.11.2017

Я исправил это, используя DB::raw с синтаксисом сервера SQL для даты и времени.

public function datetime() {

    $addDate = DB::insert("insert into TABLE (date) values (convert(date,'$date',127))");

}

Я точно не знаю, почему это происходит, но та же функция с классическим синтаксисом БД Laravel возвращает SQLSTATE[22007].

public function datetime() {

    $addDate = DB::table('TABLE')
    ->insert([
        'date'=> $date]);

   // return SQLSTATE[22007]
}
person ErnstShackleton    schedule 08.03.2017