当前位置: 首页 > 知识库问答 >
问题:

保存到SQL服务器时,Laravel日期时间格式不正确

关玄裳
2023-03-14

我正在处理一个在现有数据库上运行的项目。问题在于,在SQL Server中插入日期时间列时使用了错误的格式。服务器使用datetime作为Y-m-d,数据保存为Y-d-m。

我做了一些测试,当保存到MariaDB日期时间保存正确。

有更新的和创建的自定义字段,因此它们在模型上声明。

模型

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

这是保存数据后的QueryLog打印。正如您在查询日志中所看到的,datetime格式被正确解析为SQL Server。

克雷洛格

在Config\app.php上

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

这是否需要在SQLServer上配置?关于这一点,我已经搜索了很多,但大多数回复都是关于SQL Server分隔符的。

我还在模型上声明了protected$dateFormat='Y-m-j h: i: s: 000A';,但同样的问题也会发生。在存储Carbon对象时也存在这个问题。

当做

编辑

正如Dan所指出的,问题可能是SQL服务器上的DATEFORMAT用作DMY。此外,正如指出这个问题并由@dns_nx回答的那样,有一个解决方案可以手动更改日期格式以保存在SQL服务器上。

我已经添加到我的模型中

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

模型上的任何其他日期属性都应声明为日期:

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

我不认为这是解决问题的正确方法,但它确实有效。您可以创建另一个basemodel,如@dns_nx所述。

问候

共有1个答案

琴献
2023-03-14

我不能专门与Laravel/Eloquent交谈,但是带有强类型datetime参数的参数化查询将正确保存值。由于该值没有被正确保存,这是因为:

1) 为datetime参数类型提供的实际参数值错误

2) 参数类型为(n)varchar,其值作为不符合ISO 8601格式的字符串传递

3) 该参数作为不符合ISO 8601格式的字符串文本传递

要进行故障排除,请在dev数据库实例上运行SQL跟踪(扩展事件或探查器),包括batch_completedrpc_completed事件,以捕获实际的SQL查询。这将确定上述哪些原因是罪魁祸首。rpc_completed将包括参数类型和值。请注意,对于datetime参数类型,跟踪将始终以YYYY-MM-DD hh:MM:ss.fff格式显示datetime值,这只是传递的实际二进制值的呈现。

如果参数类型为(n)varchar,SQLServer将使用当前会话DATEFORMAT设置解析非ISO 8601日期时间字符串2018-10-06 09:07:07.222。葡萄牙语登录的默认DATEFORMATDMY,但可以由以前在同一会话上执行的明确的SETDATEFORMAT命令覆盖。使用DATEFORMAT DMY和字符串值'2018-10-06 09:07:07.222',月和日部分将被解析为月6日第10天。对日期时间文字进行类似的解析。

快速搜索发现了这个问题。因此,如果您无法强制应用程序传递强类型的datetime,解决方法可能是使用datetime2(3)而不是datetime。SQL Server将把datetime2字符串“2018-10-06 09:07:07.222”解析为YYYY-MM-DD hh:MM:ss.fff,而不考虑会话DATEFORMAT设置。对于新开发,我建议使用datetime2,因为它不会将分数秒舍入到1/300单位,也不会在更少的空间中存储更高的精度值。

 类似资料:
  • 问题内容: 我想将日期和时间从PHP保存到SQL。这是插入新记录的SQL语句(在类的方法中找到): 在.php页面中,我使用来调用当前日期和时间。但是我仍然收到错误“日期时间值不正确”。我可以用来获取日期吗? 问题答案: 一定是确切的请求时间吗?您可以使生活更轻松,只需使用: MySQL将在您的输入写入表后立即插入当前日期。

  • 下表显示可用于为图表中的日期时间字段创建用户定义的数据格式的说明符。 说明符 描述 D 将日显示为不带前导零的数字(1-31)。 DD 将日显示为带前导零的数字(01-31)。 M 将月份显示为不带前导零的数字(1-12)。 MM 将月份显示为带前导零的数字(01-12)。 MMM 将月份显示为缩写形式(Jan-Dec)。 MMMM 将月份显示为完整月份名(January-December)。 Y

  • 下表显示可用于为图表中的日期时间字段创建用户定义的数据格式的说明符。 说明符 描述 D 将日显示为不带前导零的数字(1-31)。 DD 将日显示为带前导零的数字(01-31)。 M 将月份显示为不带前导零的数字(1-12)。 MM 将月份显示为带前导零的数字(01-12)。 MMM 将月份显示为缩写形式(Jan-Dec)。 MMMM 将月份显示为完整月份名(January-December)。 Y

  • 下表显示可用于为图表中的日期时间字段创建用户定义的数据格式的说明符。 说明符 描述 D 将日显示为不带前导零的数字(1-31)。 DD 将日显示为带前导零的数字(01-31)。 M 将月份显示为不带前导零的数字(1-12)。 MM 将月份显示为带前导零的数字(01-12)。 MMM 将月份显示为缩写形式(Jan-Dec)。 MMMM 将月份显示为完整月份名(January-December)。 Y

  • 问题内容: 将记录插入数据库时​​,我无法将C#日期时间 7/31/2017 3:13:49 PM转换 为SQL日期时间。 我正在使用 但这给了我错误。 无法将字符串识别为有效的DateTime。 问题答案: .Net 直接映射到SQL Server 。这意味着您完全不需要担心显示格式,因为它没有显示格式。 您需要做的就是将struct的实例 作为参数 传递给:

  • 问题内容: 我有一个SQL查询中,我会路过,但是SQL查询需要。 如何启用此查询以根据正确的格式获取并显示正确的结果?在SQL Server 2008中实现此目标的最佳方法是什么? 这项工作正确地: 问题答案: 对于查询,我将使用格式的日期。关于输出,请参见kalyan的答案。 编辑: 总结如下(感谢marc_s)的意见,有必要使用的格式时不包括部分时间 ,除非 您使用的是新的日期类型,并在SQL