2013年8月9日 星期五

微軟的PHP連接SQL Server數據庫(Microsoft Drivers for PHP for SQL Server )

source: http://blog.csdn.net/xxhysj/article/details/8207982

PHP自帶的php_mssql.dll文件已經滿足不了sql server2005及其以上版本的使用了。微軟也隨之發布了SQL Server Driver for PHP來做相應的支持。
其中SQL Server Driver for PHP有兩個版本支持不同的php版本。
1.SQL Server Driver for PHP2.0版本適用於PHP 5.2.x版本
2.SQL Server Driver for PHP3.0版本適用於PHP 5.3.x版本

具體操作如下:
1)按上述地址下載驅動包;
2)將DLL文件解壓到PHP extension_dir目錄
      extension_dir = "X:\PHP\ext"
3)在php.ini配置文件內引用相應的動態鏈接庫文件
      extension=php_sqlsrv_52_ts_vc6.dll
      extension=php_pdo_sqlsrv_52_ts_vc6.dll
       extension=php_pdo.dll
4)重啟Apache
5)連接數據庫
  1. /* Specify the server and connection string attributes. */  
  2. $serverName  =  "(local)" ;  
  3. $connectionInfo  =  array (  "Database" => "AdventureWorks" );  
  4.   
  5. /* Connect using Windows Authentication. */  
  6. $conn  = sqlsrv_connect(  $serverName ,  $connectionInfo );  
  7. if (  $conn  === false )  
  8. {  
  9.      echo  "Unable to connect." ;  
  10.      die ( print_r( sqlsrv_errors(), true));  
  11. }  
  12.   
  13. /*  Query SQL Server for the login of the user accessing the 
  14. database. */  
  15. $tsql  =  "SELECT CONVERT(varchar(32), SUSER_SNAME())" ;  
  16. $stmt  = sqlsrv_query(  $conn ,  $tsql );  
  17. if (  $stmt  === false )  
  18. {  
  19.      echo  "Error in executing query." ;  
  20.      die ( print_r( sqlsrv_errors(), true));  
  21. }  
  22.   
  23. /* Retrieve and display the results of the query. */  
  24. $row  = sqlsrv_fetch_array( $stmt );  
  25. echo  "User login: " $row [0]. "" ;  
  26.   
  27. /* Free statement and connection resources. */  
  28. sqlsrv_free_stmt(  $stmt );  
  29. sqlsrv_close(  $conn );  
  30. ?>  

注:API 參考(SQL Server Driver for PHP)
用於SQL Server Driver for PHP的API名稱是sqlsrv。所有sqlsrv函數都以sqlsrv_打頭,後跟動詞或名詞。後跟動詞的函數用於執行特定操作,而後跟名詞的函數用於返回特定形式的元數據。


SQL Server Driver for PHP 包含以下函數:
函數
說明
開始事務。
取消語句;並放棄相應語句的所有未決結果。
提供有關客戶端的信息。
關閉連接。釋放與相應連接關聯的所有資源。
提交事務。
更改錯誤處理和日誌記錄配置。
創建一個連接,並將其打開。
返回關於上一操作的錯誤和/或警告信息。
執行預定義語句。
使下一行的數據可供讀取。
以數值索引數組、關聯數組或這兩種數組的形式檢索下一行的數據。
以對象形式檢索下一行的數據。
返回字段元數據。
關閉語句。釋放與相應語句關聯的所有資源。
返回指定配置設置的值。
按索引檢索當前行中的字段。可以指定PHP 返回類型。
檢測結果集是否具有一行或多行。
使下一結果可供處理。
報告結果集中的行數。
檢索活動結果集中的字段數。
準備Transact-SQL 查詢,但不執行該查詢。隱式綁定參數。
準備Transact-SQL 查詢,並將其執行。
回滾事務。
返回有所修改的行的數目。
在每次調用函數時向服務器發送最多八千字節(8 KB) 的數據。
提供有關服務器的信息。






2013年8月6日 星期二

SQL Server Native Client 的支援原則

http://msdn.microsoft.com/zh-tw/library/cc280356.aspx

下表將列出哪些作業系統支援 SQL Server Native Client。
SQL Server Native Client 版本
支援的作業系統
SQL Server Native Client (SQL Server 2005)
  • Microsoft Windows 2000 Service Pack 4 或更新版本
  • Microsoft Windows Server 2003 或更新版本
  • Microsoft Windows XP Service Pack 1 或更新版本
  • Microsoft Windows Vista (需要 SQL Server Service Pack 2 或更新版本)
  • Microsoft Windows Server 2008 (需要 SQL Server Service Pack 2 或更新版本)
SQL Server Native Client 10.0 (SQL Server 2008)
  • Microsoft Windows Server 2003 Service Pack 2 或更新版本
  • Microsoft Windows XP Service Pack 2 或更新版本
  • Microsoft Windows Vista
  • Microsoft Windows Server 2008
SQL Server Native Client 10.5 (SQL Server 2008 R2)
  • Microsoft Windows Server 2003 Service Pack 2 或更新版本
  • Microsoft Windows XP Service Pack 2 或更新版本
  • Microsoft Windows Vista
  • Microsoft Windows Server 2008
  • Microsoft Windows 7
SQL Server Native Client 11.0 (SQL Server 2012)
  • Microsoft Windows Vista
  • Microsoft Windows Server 2008
  • Microsoft Windows 7



http://msdn.microsoft.com/en-us/library/cc296170.aspx


2013年7月16日 星期二

計算兩個日期差距幾天-sql server版本



如果欄位並非日期格式的話 要先轉換成日期格式
CONVERT(datetime,日期欄位1),CONVERT(datetime,日期欄位2)
然後再將轉換好的丟進去做運算
DATEDIFF(datepart ,startdate,enddate)

所以結合一下 就可以寫成下面的方式
DATEDIFF (day,CONVERT(datetime,日期欄位1),CONVERT(datetime,日期欄位2))

備註 參數的部份 可以替換
日期部分
縮寫
yy、yyyy
qq、q
mm、m
一年當中的第幾天
dy、y
dd、d
wk、ww
星期幾
dw
hh
mi、n
ss、s
毫秒
ms



--------------------ASP .NET 日期相減問題--------------------------
ASP .NET VB


      Dim a As String = "0950807"
       Dim b As String = "0700925"
       Dim c As String = (Mid(a, 1, 3) + 1911) & "/" & Mid(a, 4, 2) & "/" & Mid(a, 6, 2)
       Dim d As String = (Mid(b, 1, 3) + 1911) & "/" & Mid(b, 4, 2) & "/" & Mid(b, 6, 2)
       Dim Day As Integer = (DateValue(c) - DateValue(d)).Days
       Dim YMD As Date = DateValue("0001/12/31").AddDays(Day).AddYears(-2).Date
       Response.Write("相差" & Day & "天
")
       Response.Write("相差" & YMD.Year & "年" & YMD.Month & "月" & YMD.Day & "日")
       Response.Write("
")
       Response.Write(Format(YMD, "yyyy/MM/dd"))


資料來源: http://www.blueshop.com.tw/board/.../BRD200608071555506PL.html


在 Transact-SQL 的預設日期 DATETIME 格式是 yyyy-mm-dd hh:mm:ss.mmm



在 Transact-SQL 的預設日期 DATETIME 格式是 yyyy-mm-dd hh:mm:ss.mmm

例如:

SELECT GETDATE()
=> 2007-12-31 10:30:20.517

而在程式中常常需要日期的處理,尤其是什麼只要日期不要時間啊,只要時間不要日期啊,或是日期的 Format 等等,為了省掉在程式上撰寫轉換函數,這裡有些些 Transact-SQL 常用到的日期時間格式轉換,方法如下:

SELECT CONVERT(VARCHAR(18) , getdate(), 100)
=> 12 31 2007 10:30AM

SELECT CONVERT(VARCHAR(10) , GETDATE(), 101 )
=> 12/31/2007

SELECT CONVERT(VARCHAR(10) , GETDATE(), 102 )
=> 2007.12.31

SELECT CONVERT(VARCHAR(10) , GETDATE(), 103 )
=> 31/12/2007

SELECT CONVERT(VARCHAR(10) , GETDATE(), 104 )
=> 31.12.2007

SELECT CONVERT(VARCHAR(10) , GETDATE(), 105 )
=> 31-12-2007

SELECT CONVERT(VARCHAR(10) , GETDATE(), 106 )
=> 31 12 2007

SELECT CONVERT(VARCHAR(11) , GETDATE(), 107 )
=> 12 31, 2007

SELECT CONVERT(VARCHAR(8) , GETDATE(), 108 )
=> 10:30:20

SELECT CONVERT(VARCHAR(25) , GETDATE(), 109)
=> 12 31 2007 10:30:20:517AM

SELECT CONVERT(VARCHAR(10) , GETDATE(), 110 )
=> 12-31-2007

SELECT CONVERT(VARCHAR(10) , GETDATE(), 111 )
=> 2007/12/31

SELECT CONVERT(VARCHAR(8) , GETDATE(), 112 )
=> 20071231

SELECT CONVERT(VARCHAR(23) , GETDATE(), 113 )
=> 31 12 2007 10:30:20:517

SELECT CONVERT(VARCHAR(12) , GETDATE(), 114 )
=> 10:30:20:517

SELECT CONVERT(VARCHAR, GETDATE(), 120 )
=> 2007-12-31 10:30:20

最後
SELECT REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR, GETDATE(), 120 ),'-',''),' ',''),':','')
=> 20071231103020
這個適合作為流水帳號,在同一秒不query兩次的前提下是個產生不重複值的好方法

不受時間限制,也可以用 NEWID()
select newid()




如果在我的資料庫...即有的欄位【transdate】...
其日期的格式是「20080402」...
如果我想要把他轉成『2008/04/02』...

CONVERT(DATETIME,'20080402')
就能將字串'20080402'變成日期

所以 SELECT CONVERT(VARCHAR(10), CONVERT(DATETIME, '20080402'), 111) 就能將字串'20080402'變成字串'2008/04/02'

資料來源:
http://skyerh.blogspot.com/2007/12/sql-convert.html
http://blog.makk.idv.hk/tsql_datetime_format/


[SQL]如何將字串yyyyMMddHHmmss轉成Datetime呢?



DECLARE @DateTimeVaue VARCHAR(30)
SET @DateTimeVaue = '20130402140837' -- 2013/04/02 14:08:37

--使用字串函數先將字串轉成日期格式字串再轉成DateTime (20130402140837 => 20130402 14:08:37)
SELECT  CONVERT(DATETIME, LEFT(@DateTimeVaue, 8) + ' '
       + SUBSTRING(@DateTimeVaue, 9, 2) + ':'
+ SUBSTRING(@DateTimeVaue, 11, 2) + ':'
       + RIGHT(@DateTimeVaue, 2), 112)

--使用DATEADD來將時間加總
SELECT  DATEADD(s, CAST(RIGHT(@DateTimeVaue, 2) AS INT),
               DATEADD(n, CAST(SUBSTRING(@DateTimeVaue, 11, 2) AS INT),
                       DATEADD(hh,
                               CAST(SUBSTRING(@DateTimeVaue, 9, 2) AS INT),
                               CONVERT(DATETIME, LEFT(@DateTimeVaue, 8), 112))))



資料來源:http://www.dotblogs.com.tw/rainmaker/archive/2013/04/03/99823.aspx

日期轉換(西元<-->民國)

日期轉換方式有很多種寫法,在此介紹比較簡單易懂且常用的方式︰
1.先把日期去掉("/" or "-" or ".")等符號,轉成字串形態(yyyymmdd or yymmdd),接著在相加或相減19110000
 〔EX: 2012/08/05 or 2012-08-05  2012.08.05 ==>20120805 註︰月及日一定要各兩碼,不足前面補0
  西元(yyyymmdd)轉民國
  date1="20120805" - 19110000    date1 輸出︰1010805
   
  民國轉西元(yyyymmdd)
  date2=19110000 + "1010805"     date2 輸出︰20120805

2.只針對年份做相加或相減1911,且可保有("/" or "-" or ".")等符號
 
  西元轉民國  (PS:假設今日NOW()為 2012/12/22)
  date3=year(now())-1911 & mid(FormatDateTime(now(),2),5)      date3 輸出︰101/12/22
  民國轉西元
  strDate = "101/12/22"
  DateArr = Split(strDate, "/")
  date4=Cint(DateArr(0))+1911 & mid(strDate,len(DateArr(0))+1)   date4 輸出︰2012/12/22
 
通常若要做日期比較或運算建議採用第一種寫法,若要顯示於螢幕上或報表上建議採用第二種方式
總之不管採用任何哪一種方式,都可以達到所要的結果,只是多一個步驟或少一個步驟而已。
〔如第一種寫法產生結果也可以像第二種產生結果一樣,需多加個拆解及合併動作,反之亦然〕