我用 PHP 编写了一个连接到 SQL 服务器的应用程序。如果此应用程序在 Windows 上运行,它使用srvsql库,在 linux 情况下,它使用sybase库。我的麻烦是 sql server 的日期字段输出不一样,使用 srvsql 我得到类似' 2012-12-10 12:14:26.067 '的东西。使用 sybase,我得到“ 2012 年 12 月 10 日下午 12:14:26:067 ”!
如何在不更改每个查询的情况下设置 sybase 连接以获得相同的输出格式?
我用 PHP 编写了一个连接到 SQL 服务器的应用程序。如果此应用程序在 Windows 上运行,它使用srvsql库,在 linux 情况下,它使用sybase库。我的麻烦是 sql server 的日期字段输出不一样,使用 srvsql 我得到类似' 2012-12-10 12:14:26.067 '的东西。使用 sybase,我得到“ 2012 年 12 月 10 日下午 12:14:26:067 ”!
如何在不更改每个查询的情况下设置 sybase 连接以获得相同的输出格式?
几个小时以来,我一直在寻找一个好的解决方案。虽然我很想处理这个 php 方面,但在我目前的情况下它不是一个选项,因为第 3 方库正在处理数据。我刚刚偶然发现的解决方案是在查询方面。
粗略的想法是在返回结果之前将日期转换为字符串,这样库(在我的情况下为 mssql 和 sqlsrv)就没有机会对结果产生影响。
CONVERT(nvarchar(30), myDate, 121) AS date
121 是 yyyy-mm-dd hh:mi:ss.mmm(24h)
其他选项可以在 Microsoft 的文档中找到。
前几天发现了这个。还没有尝试过它,但是 mssql 库有一个设置来告诉它如何处理日期:mssql.datetimeconvert = On
. php.ini 中可能有一种方法可以使两个库以相同的格式呈现日期。我对转换解决方案的了解太远了,现在无法切换,但如果有人第一次阅读这篇文章,那么值得进行一些实验。
与其担心从不同数据库返回的日期格式,不如考虑在 PHP 端处理它。
PHP 可以识别(2012-12-10 12:14:26.067
和)这两种格式。Dec 10 2012 12:14:26:067PM
当传递到DateTime 对象时,它们按预期工作。从 PHP 交互式提示:
php > $dt = new DateTime('Dec 10 2012 12:14:26:067PM');
php > echo $dt->format('r u'), "\n";
Mon, 10 Dec 2012 12:14:26 -0800 067000
php >
php > $dt = new DateTime('2012-12-10 12:14:26.067');
php > echo $dt->format('r u'), "\n";
Mon, 10 Dec 2012 12:14:26 -0800 067000
如果您需要复习,r
是 RFC 2822 日期的格式代码,而u
是微秒的格式代码,仅适用于 DateTimes。
通过切换到 DateTimes,您可以轻松地在输入格式之间进行切换,并且基本上不必担心它。DateTime 使用strtotime
解析规则。您会想了解它们的局限性,但通常不会遇到它们。