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 に渡していましたが、エラーを受け取った後、クエリが複雑すぎて mssql_query で処理できない場合に備えて、(適切なアクセス許可を使用して) 'BSC_Info' の上にデータベース ビューを作成しました。

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 された日付フィールドには、日付形式 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 に答える