0

简而言之,问题是:同一个数据库在不同的服务器上以不同的格式返回日期,我无法将其配置为更正日期格式。

我有以下情况:一个基于 PHP 的 Web 应用程序,它从 Microsoft FoxPro 9 数据库中获取数据。使用 OleDB 建立数据库连接。在 PHP 中,这通过 COM 对象利用 ADODB:

$this->connection = new COM("ADODB.Connection");
$this->connection->Open($this->connectionString);

连接字符串如下所示:

Provider=VFPOLEDB.1; Mode=Share Deny None; Window Handle=0; 
Locale Identifier=1033; Prompt=4; Extended Properties=0; 
User ID=; Password=; Mask Password=False; Cache Authentication=False; 
Encrypt Password=False; OLE DB Services=0; Collating Sequence=MACHINE; DSN=;
DELETED=True; ENGINEBEHAVIOR=80; TABLEVALIDATE=0; 
Data Source=\\path\to\file.DBC

该程序部署在世界各地的不同服务器上,在不同版本的 Windows Server (2003-2008 R2) 上运行。查询的执行方式如下:

$this->connection->Execute($query);

这将返回一个包含所有纯文本值的结果集。这就是问题出现的地方。数据库不使用相同的日期格式,这使得以后在 PHP 中处理日期变得困难。到目前为止,该应用程序可以处理美国格式:mm/dd/yyyy 和荷兰格式:dd-mm-yyyy。该程序只是假设当日期包含斜杠时使用美国格式,当有连字符时使用 dmy 格式。这一直很好,但现在我们最近将该程序部署到巴西的一个服务器上,它以巴西格式 dd/mm/yyyy 返回日期。该程序现在显然将其与美国格式混淆了。

我一直试图让数据库以不同的日期格式(美国)报告,但无济于事。在两个不同的开发环境中,将 windows 的区域设置更改为不同的国家会立即改变数据库使用的日期格式。这些开发环境都是 Windows 7 系统。但是,这不适用于装有 Windows Server 的服务器。我已经更改了多台服务器上的所有区域设置(格式、位置和系统区域设置),但没有任何结果。即使在使用正确的区域设置重新启动或重新安装 FoxPro 之后。数据库继续以它们似乎卡住的日期格式进行报告。

有人知道如何更改 FoxPro 在 Windows Server 环境中使用的日期格式吗?

我探索过的其他选项包括将区域信息放入 DSN,但我找不到任何可能的方法。SET DATE TO .....此外, OleDB 不接受FoxPro 语句。更改应用程序以理解巴西格式或添加一堆 if-else 语句似乎不是一个可行的解决方案。

4

3 回答 3

1

FoxPro 日期类型对日期格式不敏感。也就是说,如果您只是将值作为日期(日期时间)返回而不是转换为字符,那么您应该没有任何问题。

于 2013-07-23T20:40:39.907 回答
1

用第二个可选参数将 FoxPro 日期字段包装在DTOC函数中。这将返回标准的 YYYY-MM-DD 样式日期,无论区域设置如何。

SELECT DTOC(dDate) as dDate FROM Alias

如果这不可行,您将需要研究在 FoxPro 中显式设置区域设置的函数,例如直观命名的SYS(3005)

而且,即使这不可行,您也需要求助于要求国外的服务器在操作系统级别对其区域设置进行标准化。

于 2013-08-01T05:05:19.290 回答
0

也许在您的查询中明确并处理在 Web 应用程序中重建日期。因此,如果您在 VFP 中有一个名为 MyDate 的日期类型字段,请执行以下操作:

select x, y, z, day(MyDate) as daynum, month(MyDate) as monthnum, ;
year(MyDate) as yearnum from mytable 

好的,所以在另一个方面需要更多的工作来重建一个日期,但至少它应该与位置无关。

于 2013-07-25T20:12:37.253 回答