0

我正在使用 PHP 查询 SQL Server 2008 R2 上的一些数据并收到以下错误:

  • PHP 警告:mssql_query():消息:从字符串转换日期和/或时间时转换失败。(严重性 16)在 /var/www/html/BSC_Entry.php 第 14 行
  • PHP 警告:mssql_query():一般 SQL Server 错误:在第 14 行的 /var/www/html/BSC_Entry.php 中检查来自 SQL Server(严重性 16)的消息

这是代码块:

  3 <?php // Initialise all database actions
  4     //IP of server
  5     $server = 'x.x.x.x';
  6 
  7     // Connection to MSSQL - possibly use password file
  8     $link = mssql_connect($server, 'user', 'pass');
  9     if (!$link) {
 10         die('Something went wrong while connecting to MSSQL');
 11     }
 12 
 13     // Declare query to return BSC_Name, BSC_Owner and  
 14     $qBSCInfo = mssql_query('SELECT * FROM dbo.BSC_Info;', $link);
 15 
 16 ?>

最初,我将下面的 SQL 作为参数传递给 mssql_query,但在收到错误后,在“BSC_Info”上方创建了数据库视图(具有适当的权限),以防查询过于复杂而无法处理 mssql_query:

SELECT DISTINCT 
    dbo.BSC.BSC_ID,
    dbo.BSC.BSC_Name, 
    dbo.BSC.BSC_Owner, 
    DATEDIFF(M, MAX(CONVERT(DATETIME, LEFT(dbo.BSCDataSet.DatePeriod, 4) 
                      + RIGHT(dbo.BSCDataSet.DatePeriod, 2) + '01')), CONVERT(DATETIME, LEFT(CONVERT(VARCHAR, GETDATE(), 120), 4) + RIGHT(LEFT(CONVERT(VARCHAR, GETDATE(), 
                      120), 7), 2) + '01')) AS Periods_to_Current
FROM dbo.BSC 
LEFT OUTER JOIN dbo.BSCDataSet 
ON dbo.BSC.BSC_ID = dbo.BSCDataSet.BSC_ID
GROUP BY dbo.BSC.BSC_ID, dbo.BSC.BSC_Name, dbo.BSC.BSC_Owner

为了澄清,该查询在 SQL Server Management Studio 中工作,返回表中的一些字段以及当前日期和较早日期之间的差异(以月为单位)(以 VARCHAR - YYYYMM 格式存储在数据库中)。为了防止部分月份出现任何问题,我已将比较日期设置为该月的第一天。我确信有一种更优雅的方法可以做到这一点,但我对 SQL Server 或 PHP 的经验很少!

数据类型有:

  • BSC_ID - 数字(5,0)
  • BSC_Name - varchar(50)
  • BSC_Owner - varchar(50)
  • Periods_to_Current - int

任何帮助将非常感激。大家干杯!

4

1 回答 1

1

所以这段代码有很多问题:

  • php.ini 文件需要 mssql 设置:mssql.datetimeconvert = 0
  • 任何 CONVERT-ed 日期字段都需要日期格式 121
  • 原始代码尝试在可能为 NULL 的日期字段上执行转换、日期算术和 MAX() 函数 - 哎呀

我现在已将代码修改为更合适(并且有效):

SELECT 
  dbo.BSC.BSC_ID,
  dbo.BSC.BSC_Name, 
  dbo.BSC.BSC_Owner, 
  CASE maxview.maxDate 
    WHEN NULL THEN NULL 
    ELSE DATEDIFF(M,CONVERT(DATETIME, LEFT(maxview.maxdate, 4)+ RIGHT(maxview.maxdate, 2) + '01', 121),GETDATE()) 
  END 
FROM dbo.BSC 
LEFT OUTER JOIN (SELECT BSC_ID, MAX(dbo.BSCDataSet.DatePeriod) as maxDate 
FROM dbo.BSCDataSet GROUP BY BSC_ID) maxview 
ON dbo.BSC.BSC_ID = maxview.BSC_ID;

希望这会帮助别人!

于 2012-05-01T14:49:12.357 回答