2012-04-30 18 views
0
私は、SQL Server 2008 R2上のいくつかのデータを照会するPHPを使用して、次のエラー受け付けております

PHPののmssql_queryエラー時に、文字列から日付/時刻を変換

  • PHPの警告:のmssql_queryを():メッセージを:文字列から日付および/または時刻を変換するときに変換に失敗しました。 (重大度16)/var/www/html/BSC_Entry.php 14行目
  • PHPの警告:mssql_query():一般的なSQL Serverエラー:/ var/www/htmlのSQL Serverからのメッセージ(重大度16)を確認します。ライン上の/BSC_Entry.php 14

ここでは、コードブロックです:

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 ?> 

は当初、私はのmssql_queryするパラメータとして、以下のSQLを渡しましたが、エラーを受け取った後、上記のデータベースビューを作成したが、クエリが複雑すぎてmssql_queryが処理できない場合の適切なアクセス許可を持つ 'BSC_Info'(

) 0
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型

ご協力いただければ幸いです。乾杯!

答えて

1

だから、このコードで多くの問題がありました:

  • php.iniファイルは、MSSQLの設定が必要:mssql.datetimeconvert = 0
  • どれCONVERT-EDの日付フィールドは、日付フォーマットを必要と121
  • 元のコードは、潜在的にNULL日付フィールドに変換、日付演算MAX()関数を実行しようとした - おっと

Iが

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; 

このコードを使用すると、誰かが助けてくれることを願っています。

関連する問題