Неверный формат даты и времени Laravel при сохранении в SQL Server - PullRequest
0 голосов
/ 06 октября 2018

Я работаю над проектом, работающим на существующей базе данных.Проблема заключается в том, что столбцы даты и времени вставляются в SQL Server в неправильном формате.Сервер использует datetime в качестве Ymd, а данные сохраняются в формате Ydm.

Я провел несколько тестов, и при сохранении в MariaDB datetime сохраняется правильно.

Существуют настраиваемые поля для updated_at иcreate_at, поэтому они объявлены в модели.

В модели

class NotaFaturamento extends Model
{
    const CREATED_AT = 'DT_CADASTRO';
    const UPDATED_AT = 'DT_ATUALIZACAO';

Это печать QueryLog после сохранения данных.Как видно из журнала запросов, формат даты и времени правильно анализируется в SQL Server.

Querylog

On Config \ app.php

'timezone' => 'America/Sao_Paulo',
'locale' => 'pt-BR',

Это то, что нужно настроить на SQLServer?Я много об этом искал, но большинство ответов касаются разделителей SQL Server.

Я также объявил защищенный $dateFormat = 'Y-m-j h:i:s:000A'; на модели, но возникает та же проблема.Эта проблема также присутствует при хранении углеродных объектов.

С уважением.

РЕДАКТИРОВАТЬ

Как указал Дэн, проблема может быть связана с DATEFORMAT наSQL Server используется как DMY.Кроме того, как указывалось на эту проблему и на нее ответил @dns_nx, существует обходной путь для ручного изменения формата даты для сохранения на SQL Server.

Я добавил в свою модель

public function getDateFormat()
{
   return 'Y-d-m H:i:s.v';
}

И любые другие атрибуты даты в модели должны быть объявлены как даты:

protected $dates = ['DT_EMISSAO', 'DT_COMPETENCIA'];

Я не думаю, что это правильный способ решения проблемы, но он работает.И вы могли бы создать другую базовую модель, как упомянуто в @ dns_nx.

С уважением

1 Ответ

0 голосов
/ 13 октября 2018

Я не могу говорить с Laravel / Eloquent, но параметризованный запрос со строго типизированным параметром datetime сохранит значение должным образом.Поскольку значение не сохраняется правильно, это происходит потому, что:

1) Неверное действительное значение параметра, заданное для datetime типа параметра

2) Тип параметра (n)varchar со значением, переданным в виде строки, которая не соответствует формату ISO 8601

3) Параметр передается в виде строкового литерала, который не соответствует формату ISO 8601

Для устранения неполадокзапустите трассировку SQL (расширенные события или профилировщик) для своего экземпляра базы данных dev, включая события batch_completed и rpc_completed, чтобы захватить фактические запросы SQL.Это позволит определить, какая из перечисленных выше причин является виновником.rpc_completed будет включать как тип параметра, так и значение.Имейте в виду, что с типом параметра datetime в трассировке всегда будет отображаться значение datetime в формате YYYY-MM-DD hh:mm:ss.fff, которое представляет собой просто отображение фактического переданного двоичного значения.

Если тип параметра - (n)varchar, строка даты-времени, отличная от ISO 8601, '2018-10-06 09: 07: 07.222' будет проанализирована SQL Server с использованием текущей настройки сеанса DATEFORMAT.Значение по умолчанию DATEFORMAT для входа на португальском языке - DMY, но его можно переопределить с помощью явной команды SET DATEFORMAT, ранее выполненной в том же сеансе.При DATEFORMAT DMY и строковом значении '2018-10-06 09: 07: 07.222' часть месяца и дня будет проанализирована как месяц 6 день 10. Литералы даты и времени аналогично анализируются.

Быстрый поискпоявился этот вопрос .Следовательно, если вы не можете заставить строго типизированный datetime быть переданным приложением, можно использовать обходной путь datetime2(3) вместо datetime.SQL Server будет анализировать datetime2 string '2018-10-06 09: 07: 07.222' как YYYY-MM-DD hh:mm:ss.fff независимо от настройки сеанса DATEFORMAT.Я рекомендую datetime2 для новой разработки, поскольку она не округляет доли секунды до 1/300 единиц и сохраняет более точные значения в меньшем пространстве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...