12月 26, 2007

計算上班時間(扣除六、日,中午休息時間)in SQLServer2005

因為找不到類似的東西所以自已寫了一個(總覺得又在亂打造輪子...)
把計算上班日的程式放到SQL處理,好處是效能好,可以直接用SQL做SUM、AVG等運算
想扣國定假日的話,可以把日期存在table再去比對,這部份我就沒寫了,有大大寫好的話
請分享給我,謝謝,哈哈

函數名稱
GetWorkMinute(開始時間,結束時間)

傳回值
扣除星期六、日,午休,上班八小時以外的分鐘數


使用方式:


範例一

SELECT dbo.GetWorkMinute('2007-12-19 17:17','2007-12-20 11:59') as worktime



傳回:222

*呼叫自訂函數時要打全名不可省略dbo





程式碼:





 

--登入 DB
USE DB名稱;
GO
--如果有叫做dbo.GetWorkMinute的函數就移除它
IF OBJECT_ID (N'dbo.GetWorkMinute', N'FN') IS NOT NULL
DROP FUNCTION dbo.GetWorkMinute;
GO
CREATE FUNCTION GetWorkMinute
(
@startDate DATETIME ,
@endDate DATETIME
)
RETURNS int
AS
--程式開始的區塊,類似C、php的大括號
Begin
--定義變數的保留字declare
declare @DayMinute int,@s_Minute int,@s_Minute2 int,@i int,@x DATETIME,@resultMin int
--值帶給變數的時候前面要加set
set @DayMinute = 8*60 --1天上班小時
set @s_Minute = 9*60 --早上點上班
set @s_Minute2 = 18*60 --下午點下班
declare @weekdays int,@totalDay int,@bgMin int,@endMin int
set @i = 0
if @startDate is not null and @endDate is not null
set @weekdays = 0
--計算申請日期和建置完成日期差幾天
set @totalDay=DateDiff(day,@startDate,@endDate)
--開始時間換算為分鐘
set @bgMin=(DatePart(hour,@startDate)*60+DatePart(minute,@startDate))
--建置完成時間換算成分鐘
set @endMin=(DatePart(hour,@endDate)*60+DatePart(minute,@endDate))
--取申請日期和建置日期中有幾個假日
while @i<=DateDiff(day,@startDate,@endDate)
begin
set @x=DateAdd(day,@i,@startDate)
if DatePart(weekday,@x)=1 or DatePart(weekday,@x)=7
set @weekdays=@weekdays+1
set @i=@i+1
end
--計算總花費時間
--若申請時間、建置時間相隔超過一天
-- (公司下班時間- 申請時間) + (建置完成時間- 公司上班時間) + 中間相隔天數*8 *60 -日期區間中的六、日
--否則
-- 建置時間- 開始時間
if @totalDay>=1
--跨天
begin
set @resultMin= abs(@s_Minute2-@bgMin)+abs(@endMin-@s_Minute)+((@totalDay-1)*@DayMinute)-(@weekdays*@DayMinute)
end
else
--同一天
begin
set @resultMin=abs(@endMin-@bgMin)
end
--判斷有沒有經過中午,有的話扣掉中午休息時間
if @totalDay>=1
--跨天
begin
if DatePart(hour,@startDate) <12
set @resultMin=@resultMin-60
if DatePart(hour,@endDate) >12
set @resultMin=@resultMin-60
end
else
begin
--同一天
if DatePart(hour,@startDate) <12 and DatePart(hour,@endDate) >12
set @resultMin=@resultMin-60
end
return @resultMin
END




如何在SQL server中設定自訂函數






打開SQL server Management >新增查詢>貼入程式碼



成功以後會出現在



使用SQL Server Business Intelligence Development Studio匯到Access資料

把Access資料轉到SQLserver有很多方式,寫程式轉(很麻煩= =)、用Access2003的轉換精靈(不能更換資料表名稱,不能批次轉換,若Access DB很少可以用這方法)

使用SQL Server Business Intelligence Development Studio雖然也是麻煩但設定檔設定完成後可以批次轉換所有Access資料庫,適合Access DB量大的時候

開啟Microsoft Visual studio 2005 > Microsoft Visual studio 2005



專案 > SSIS匯入和匯出精靈



選擇資料來源Microsoft Access

選擇資料目的



來源是Access的資料表,目的地是SQL的資料表,你可以把目的地的table 名稱改成你想要的

然後按設定選先卸除再建立新目的資料表(如果SQLserver原本就有同樣名稱的資料表,轉檔時會發出錯誤,所以先移除同樣檔名的資料表)



Intelligence service會自動產生左邊紅框框的流程
卸除資料表SQL工作:如果有選擇先卸除再建立新目的資料表就會出現
準備SQL工作:會在SQL server中建立剛匯入的table schema,但是不會帶出原本的主鍵、外鍵等...= =
資料流程工作:設定access資料和sql資料的mapping



因為準備SQL工作中,沒有主鍵等設定…所以自已加入,設定如下

主鍵: PRIMARY KEY

欄位自動加1: IDENTITY (1, 1)

複數主鍵:

CONSTRAINT [PK_TABLE的名稱_site] PRIMARY KEY CLUSTERED

(

[主鍵欄位1] asc,

[主鍵欄位2] asc

)

範例:

CREATE TABLE [EOP-APP004].[dbo].[MCline] (

[pr_id] int ,

[seq] int,

[planner_coder] nvarchar(10),

[part_no] nvarchar(50),

[part_desc] nvarchar(100),

CONSTRAINT [PK_MCline_site] PRIMARY KEY CLUSTERED

(

[pr_id] ASC,

[seq] asc

)

)

GO

或是

用access 2003的SQL轉換精靈先轉進一個暫時的資料庫



然後用sql server2005的物件總管查看create table該table的語法



把table的schema設好後,就是一個基本的轉檔script,你可以利用Intelligence Development Studio提供的其他工作再加上其他的功能。

計算上班時間扣除六、日,中午休息時間in SQLServer2005

因為找不到類似的東西所以自已寫了一個(總覺得又在亂打造輪子...)
把計算上班日的程式放到SQL處理,好處是效能好,可以直接用SQL做SUM、AVG等運算
想扣國定假日的話,可以把日期存在table再去比對,這部份我就沒寫了,有大大寫好的話請分享給我,謝謝,哈哈
函數名稱
GetWorkMinute(開始時間,結束時間)

傳回值

扣除星期六、日,午休,上班八小時以外的分鐘數

使用方式:
範例一
SELECT   dbo.GetWorkMinute('2007-12-19 17:17','2007-12-20 11:59') as worktime
傳回:222
*呼叫自訂函數時要打全名不可省略dbo
程式碼:
--登入 DB
USE DB名稱;
GO
--如果有叫做dbo.GetWorkMinute的函數就移除它
IF OBJECT_ID (N'dbo.GetWorkMinute', N'FN') IS NOT NULL
    DROP FUNCTION dbo.GetWorkMinute;
GO
CREATE     FUNCTION GetWorkMinute
(
     @startDate DATETIME ,
     @endDate DATETIME
)
RETURNS int
AS
--程式開始的區塊,類似C、php的大括號
Begin
    --定義變數的保留字declare
    declare @DayMinute int,@s_Minute int,@s_Minute2 int,@i int,@x DATETIME,@resultMin int
     --值帶給變數的時候前面要加set
  set @DayMinute = 8*60    --1天上班小時
    set @s_Minute = 9*60     --早上點上班
    set @s_Minute2 = 18*60   --下午點下班  
    declare @weekdays int,@totalDay int,@bgMin int,@endMin int
    set @i = 0
    if @startDate is not null and @endDate is not null
        set @weekdays = 0      
        --計算申請日期和建置完成日期差幾天
        set @totalDay=DateDiff(day,@startDate,@endDate)
        --開始時間換算為分鐘
        set @bgMin=(DatePart(hour,@startDate)*60+DatePart(minute,@startDate))
        --建置完成時間換算成分鐘
        set @endMin=(DatePart(hour,@endDate)*60+DatePart(minute,@endDate))
        --取申請日期和建置日期中有幾個假日
        while  @i<=DateDiff(day,@startDate,@endDate)
            begin  
                set @x=DateAdd(day,@i,@startDate)  
                if DatePart(weekday,@x)=1 or DatePart(weekday,@x)=7            
                    set @weekdays=@weekdays+1      
                    set @i=@i+1            
            end
--計算總花費時間
--若申請時間、建置時間相隔超過一天
--    (公司下班時間- 申請時間) + (建置完成時間- 公司上班時間) + 中間相隔天數*8 *60 -日期區間中的六、日
--否則
--     建置時間- 開始時間
if @totalDay>=1
    --跨天
    begin      
        set @resultMin= abs(@s_Minute2-@bgMin)+abs(@endMin-@s_Minute)+((@totalDay-1)*@DayMinute)-(@weekdays*@DayMinute)
    end
else
    --同一天
    begin
        set @resultMin=abs(@endMin-@bgMin)
    end
--判斷有沒有經過中午,有的話扣掉中午休息時間
if @totalDay>=1
    --跨天
    begin
        if  DatePart(hour,@startDate) <12
            set @resultMin=@resultMin-60
        if  DatePart(hour,@endDate) >12
            set @resultMin=@resultMin-60
    end    
else
    begin
        --同一天
        if   DatePart(hour,@startDate) <12 and  DatePart(hour,@endDate) >12
            set @resultMin=@resultMin-60
    end
return @resultMin
END
 

如何在SQL server中設定自訂函數

打開SQL server Management >新增查詢>貼入程式碼

成功以後會出現在

SQL server 2005自訂函數

因為要計算時間區間內沒有周休二日、午休時間的真正上班時間

之前寫在asp、php裡感覺比較慢也覺得code不好維護。

為什麼SQL沒有只抓上班時間的函數= =

研究了一下自訂函數的方法,因為第一次接觸有錯請告訴我,謝謝

撰寫的位置:

登入SQL Server Management Studio後>新增查詢

CODE:

--登入你的DB
USE Tbcwmonet;
GO
--如果dbo.GetWorkMinute這個函已存在就刪掉
IF OBJECT_ID (N'dbo.GetWorkMinute', N'FN') IS NOT NULL
    DROP FUNCTION dbo.GetWorkMinute;
GO
CREATE     FUNCTION GetWorkMinute
(
     @要帶入的值1 資料型態 ,
     @要傳入的值2 資料型態,
     @..............................
)
RETURNS int
AS

begin

return @要傳回的值
end

說明
Begin....END:類似C、Java、PHP的大括號{、}用來把程式的區塊標出來

EX:
(計算日期區間中的六、日有幾天)
while  @i<=DateDiff(day,@startDate,@endDate)
   begin 
    set @x=DateAdd(day,@i,@startDate) 
    if DatePart(weekday,@x)=1 or DatePart(weekday,@x)=7     
     set @weekdays=@weekdays+1  
     set @i=@i+1    
   end

變數要用declare宣告,並用@開頭,值給變數時要用set

EX:
declare @DayMinute int,@s_Minute DATETIME
set @DayMinute = 8*60   
set @s_Date ="2008/01/01"

寫完後按執行
SQL server 2005自訂函數會放在DB中>可程式性>函數>純量值函數的資料夾中。

12月 05, 2007

第一次的Air程式-Where are you

起因是同事常到處亂跑,常找不到人所以寫了這支程式,不過寫了也沒人用,哈哈哈~

功能:置換圖片,改變所在位置和描述,並有置頂、最小化關閉等功能

用Flex3+php上傳檔案

以下是flex3+php的上傳檔案範例,以Air的型式發佈也很方便

下載原始檔

FLEX










import mx.controls.ProgressBar;
import flash.events.MouseEvent;
import mx.controls.Alert;
import mx.collections.ArrayCollection;
import mx.rpc.events.ResultEvent;
import mx.managers.CursorManager;
import mx.core.Application;

private var urlRequest:URLRequest;
private var fileReferenceList:FileReferenceList;
private var pb:ProgressBar;
private var serverSideScript:String = "http://localhost/flex/place/v2/upload.php";
private function inite():void{
//檔案上傳宣告
urlRequest = new URLRequest(serverSideScript);
fileReferenceList = new FileReferenceList();
fileReferenceList.addEventListener(Event.SELECT, fileSelectedHandler);
}
//檔案上傳
private function uploadFile():void {
fileReferenceList.browse();
uploadProgress.setProgress(0,0);
}
private function fileSelectedHandler(event:Event):void {
var fileReference:FileReference;
var fileReferenceList:FileReferenceList = FileReferenceList(event.target);
var fileList:Array = fileReferenceList.fileList;
fileReference = FileReference(fileList[0]);
//監聽上傳進度丟出的事件
fileReference.addEventListener(ProgressEvent.PROGRESS,progressHandler);
//監聽是否完成
fileReference.addEventListener(Event.COMPLETE, uploadCompleteHandler);
fileReference.upload(urlRequest,"Filedata");
statusText.text = "上傳中...";
CursorManager.setBusyCursor();
}
private function progressHandler(event:ProgressEvent):void{
uploadProgress.setProgress(event.bytesLoaded, event.bytesTotal);
}

private function uploadCompleteHandler(event:Event):void {
statusText.text = "上傳成功的文件: " +event.target.name ;
CursorManager.removeBusyCursor();
Alert.show(event.target.name+"上傳成功")

}
//檔案上傳結束

]]>








php



$uploaddir = 'uploads/';
$uploadfile = $uploaddir . basename($_FILES['Filedata']['name']);
$temploadfile = $_FILES['Filedata']['tmp_name'];
move_uploaded_file($temploadfile , $uploadfile);
?>



12月 01, 2007

IE出現Internet Explorer無法開啟網際網路網站http://xxxxxx,操作已終止



今天在IE試EXT的時候一直出現這個問題
但是Firefox一切正常,上google查了才知道
這是因為IE在頁面尚未載入完成時就執行了
EXT的Script
所以加上onReady就ok了!