簡體   English   中英

從字符串轉換日期和/或時間時,PHP mssql_query錯誤

[英]PHP mssql_query errors when converting date and/or time from character string

我正在使用PHP查詢SQL Server 2008 R2上的某些數據並收到以下錯誤:

  • PHP警告:mssql_query():消息:從字符串轉換日期和/或時間時轉換失敗。 (嚴重性16)在第14行的/var/www/html/BSC_Entry.php中
  • 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

任何幫助將非常感激。 歡呼大家!

因此,此代碼存在許多問題:

  • php.ini文件需要mssql設置: mssql.datetimeconvert = 0
  • 任何轉換日期字段都需要日期格式121
  • 原始代碼試圖對可能為NULL的日期字段執行轉換,日期算術和MAX()函數-oops

我現在將代碼修改為更合適的代碼(並且可以正常工作):

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;

希望這可以幫助某人!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM