| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3256 人关注过本帖
标题:如何选取查询结果中条件相同结果的最大最小值
只看楼主 加入收藏
贝贝考
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2012-1-26
收藏
得分:0 
再次感谢版主。
2012-02-23 17:39
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
如果超過22:30不作數,就用下面修正過的代碼:

程序代码:
CLEAR ALL
CLOSE DATABASES ALL
CLEAR 

SET SAFETY OFF
SET EXACT ON
SET DATE ANSI                 && 使用yy/mm/dd格式
SET CENTURY ON                 && 世纪格式yyyy
SET STRICTDATE TO 1            && 严格日期格式
SET HOURS TO 24

cInTime = "19:00"
cOutTime = "22:30"

CreateTargetDBF()
USE TargetDB INDEX TargetDB EXCLUSIVE IN 0
SELECT TargetDB
cID = ""
SCAN ALL
    IF cID != TargetDB.id
        cID = TargetDB.id
        nCount = 0
    ELSE
        nCount = nCount + 1
    ENDIF
    IF nCount > 0
        SKIP -nCount
        tTime1 = TargetDB.checktime
        REPLACE TargetDB.time1 WITH "", TargetDB.time2 WITH "", TargetDB.time3 WITH ""
        SKIP nCount
        tTime2 = TargetDB.checktime
        REPLACE TargetDB.time1 WITH "", TargetDB.time2 WITH ""
        REPLACE TargetDB.time3 WITH GetTimeString(tTime2 - tTime1)
    ELSE
        tTime1 = DATETIME(YEAR(TargetDB.checktime), MONTH(TargetDB.checktime), DAY(TargetDB.checktime), VAL(LEFT(cInTime,2)), VAL(RIGHT(cInTime,2)))
        tTime2 = DATETIME(YEAR(TargetDB.checktime), MONTH(TargetDB.checktime), DAY(TargetDB.checktime), VAL(LEFT(cOutTime,2)), VAL(RIGHT(cOutTime,2)))
        tTime = IIF(TargetDB.checktime > tTime2, tTime2, TargetDB.checktime)
        REPLACE TargetDB.time1 WITH GetTimeString(tTime - tTime1)
        REPLACE TargetDB.time2 WITH GetTimeString(tTime2 - tTime)
    ENDIF
ENDSCAN
BROWSE
USE IN TargetDB

CLOSE DATABASES ALL
CLEAR ALL
RETURN 

PROCEDURE CreateTargetDBF()
    USE 111 ALIAS SourceDB EXCLUSIVE IN 0
    INDEX ON userid TO 111
    SELECT SourceDB
    COPY STRUCTURE TO TargetDB
    ALTER TABLE TargetDB ADD COLUMN id C(11)
    ALTER TABLE TargetDB ADD COLUMN time1 C(8)        && 打卡时间与标准上班时间之差
    ALTER TABLE TargetDB ADD COLUMN time2 C(8)        && 标准下班时间与打卡时间之差
    ALTER TABLE TargetDB ADD COLUMN time3 C(8)        && 有完整上下班打卡记录的时间
    SELECT TargetDB
    INDEX ON id TO TargetDB
    SELECT SourceDB
    GOTO TOP
    SCAN ALL
        IF SUBSTR(TTOC(SourceDB.checktime), 12, 5) >= cInTime
            SELECT TargetDB
            APPEND BLANK
            REPLACE TargetDB.userid WITH SourceDB.userid
            REPLACE TargetDB.checktime WITH SourceDB.checktime
            REPLACE TargetDB.id WITH PADL(SourceDB.userid, 3, '0') + CHRTRAN(LEFT(TTOC(SourceDB.checktime), 10), '.', '')
        ENDIF
        SELECT SourceDB
    ENDSCAN
    USE IN SourceDB
    USE IN TargetDB
ENDPROC 

FUNCTION GetTimeString(tnSeconds)
    LOCAL lcString
   
    lcString = ""
    DO WHILE tnSeconds > 0
        lcString = PADL(MOD(tnSeconds, 60), 2, '0') + lcString
        tnSeconds = INT(tnSeconds / 60)
        IF tnSeconds > 0
            lcString = ":" + lcString
        ENDIF
    ENDDO
   
    RETURN lcString
   
ENDFUNC


得到這些數據之後,怎麼取捨,你自己應該能夠做下去了,後面我就不寫啦。自己修改一下程序,那代碼應該不難理解。

授人以渔,不授人以鱼。
2012-02-23 17:42
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你全部數據中,只有三條是完整打卡的,其餘全部缺一次,除非極靠近兩端點的時刻,基本無法判斷那是上班還是下班。

另外,即使經過32樓的修改,這個程序仍然有一個必須注意的問題:沒有考慮在19:00之前打卡的情況,這樣極可能在創建結果數據表時被漏掉。要考慮這個問題,必須具備識別19:00前打卡到底是日班下班還是晚上加班的上班的方法,一個可能的建議就是把標準上班時間19:00往前挪15分鐘,讓在這個時間範圍內打卡的記錄也進入加班表。

[ 本帖最后由 TonyDeng 于 2012-2-23 22:59 编辑 ]

授人以渔,不授人以鱼。
2012-02-23 18:16
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
回复 32楼 TonyDeng
学习了。在?

坚守VFP最后的阵地
2012-02-23 21:50
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
不在

授人以渔,不授人以鱼。
2012-02-23 22:24
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
以下是引用TonyDeng在2012-2-23 22:24:01的发言:

不在
把YB.XLSX转换为YB.XLS,谢谢了

yb.rar (81.42 KB)

坚守VFP最后的阵地
2012-02-23 22:35
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
yb.zip (262.5 KB)

只改擴展名即可,沒壓縮的。

授人以渔,不授人以鱼。
2012-02-23 22:44
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
回复 37楼 TonyDeng
图片附件: 游客没有浏览图片的权限,请 登录注册

WINRAR什么版本
64位?

[ 本帖最后由 sdta 于 2012-2-23 22:52 编辑 ]

坚守VFP最后的阵地
2012-02-23 22:51
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
都說了不用解壓,根本就不是壓縮文件。

授人以渔,不授人以鱼。
2012-02-23 22:52
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
回复 39楼 TonyDeng
不用改直接就打开了。
资料不规范

[ 本帖最后由 sdta 于 2012-2-23 23:01 编辑 ]

坚守VFP最后的阵地
2012-02-23 22:57
快速回复:如何选取查询结果中条件相同结果的最大最小值
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.040537 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved