如何设置 SQL Server PHP 驱动程序的日期时间格式

如何设置 SQL Server PHP 驱动程序的日期时间格式

在我的 PHP 脚本中,我想将日期添加到 MS SQL Server 中的列(类型为 datetime)。我按照此博客文章设置了连接(Ubuntu 14.04/15.10 上的 php5-sybase、php5-odbc、freetds): 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′)

明显地,查询中的日期时间被解释为麦迪逊,但我找不到任何选项来改变它。令人惊讶的是,它在 Ubuntu 15.10 下可以运行,但在 14.04 下却不行,对 apache、php 使用相同的配置。freetds 和 php5-odbc 使用它们的默认值。

SQL Server 设置 (@@LANGUAGE = Germand、sp_helplanguage German dateformat = dmy) 和php.ini(iconv 日期时间格式)有麦迪逊配置。mssql.datetimeconvert = 开启与关闭没有区别。

tl;dr 我如何告诉 PHP 日期时间格式不是 MDY 而是 DMY?

答案1

正如评论中指出的那样转变()是一种解决方法。我不是 MS SQL 专家。我主要使用 MySQL。然而查找了一下,MS SQL 日期时间使用格式yyyy-mm-dd hh:mm:ss

SET DATEFORMAT设定顺序用于解释 date、smalldatetime、datetime、datetime2 和 datetimeoffset 字符串的月、日和年日期部分。

SET DATEFORMAT dmy;应该完成你需要的任务

答案2

/etc/freetds/locales.conf根本原因既不是 PHP,也不是 freetds,也不是任何 *NIX 系统设置。设置日期时间格式的详尽文档可以正常工作。

但是为了让 FREETDS 驱动程序解释指定格式的日期,您不能在查询中将其编码为字符串

正如你在我的问题中看到的,类型字段的值约会时间用单引号/勾号括起来。这样,FreeTDS 会将数据解释为字符串(准确地说是 varchar),并将其传递给 SQL Server。这就是查询失败的原因,因为 SQL-Server 不允许将 varchar 插入到 datetime 列中。

为什么完全相同的查询在 Ubuntu 的一个版本上有效,而在另一个版本上却无效,这让我无法理解。

tl;dr 不要在查询中使用引号括住日期时间值。我只花了 3 个月就意识到了这一点 :)

相关内容