CIO的24小时

CIO的24小时

2006-4-10 文/陈念

文章来源:信息周刊

我在采访通讯录中,随机抽取一位首席信息官(CIO),拨通他的电话,“能告诉我你是怎样安排你的一天的吗?”“哦,没法给你答案,每天都很忙碌,有时候一天要开10个以上的会,我甚至不能自主地安排自己的时间。”他说。



CIO的大部分时间都花在技术和业务的沟通上,他们的一天忙乱、紧张而琐碎,确实很难精确地描述一位CIO每天的工作安排。但是通过把多位CIO在一天中的工作片段进行剪辑,我们仍然可以看到CIO们每天都在处理哪些事务。

8:00
还不到公司规定的上班时间,很多CIO的身影已经出现在办公室里了。汤姆逊广东显示器件有限公司IT总监袁迈克每天很早就出发上班了,通常在广东佛山和东莞之间来回办公。他刚从国外开会回来,目前集团正在讨论进行全球IT的整合,由于袁迈克和他团队的出色表现,欧洲总部希望把中国地区的IT部门作为全球整合的一个模板。

9:00
新技术层出不穷,CIO需要有选择性地进行了解。在中欧国际工商学院的大会议厅中,上海贝尔阿尔卡特股份有限公司副总裁兼CIO朱战备正在聚精会神地听着“RFID Connect China 2006”的系列演讲。虽然近期公司没有部署无线射频识别(RFID)技术,但是他认为,作为一个CIO,对各种新技术都应该有所了解才行。

10:00
对CIO来说,花在沟通上的时间是必不可少的。
上海纺织(集团)有限公司信息技术部经理王建红来到集团下面一个以运输物流为主的投资公司。她要和投资公司的项目参与人员以及合作开发商,一起讨论如何建立物流系统的事情。经过一番讨论后,王建红从集团的角度,对系统的构建提出了自己的建议。

11:00
在西门子(中国)有限公司会议室里,COM信息部首席信息执行官李福生正介绍特意邀请过来的信息技术基础设施库(ITIL)方面的专家,他认为ITIL对企业意义重大,需要给公司IT部门员工安排一次全面系统的培训。

12:00
午餐时间,这是CIO们唯一能够偷得一点闲暇的时间。
此时,他们通常会翻阅一些手边的报纸、书籍,或者上网浏览一下当天的新闻。也有的时候,他们宁愿什么都不做,泡一杯茶,静静地发一会儿呆,想想工作或工作以外的事情,让身心彻底地放松一下。
但不少CIO连这个时间也必须利用起来。由于手边的事情太多,广东格兰仕集团有限公司副总裁俞尧昌刚接受完媒体采访,就跑到公司员工食堂随便吃了几口饭,又跑回办公室处理文案。

13:00
连轴转的工作又开始了。王建红和办公室人员,以及公司党建工作人员在一起探讨如何从形象上统一集团网站的定位和风格,进一步扩大网站的宣传力度。集团网站的改版很快就要开始了,这次改版不仅涉及集团本部,还涉及到下面的投资公司,因此需要事先做好周密的规划。

16:00
李福生和他的德国同事在一起交流彼此的问题和计划。他发现,德国企业的效率通常很高,这点对中国企业颇有借鉴意义。德国慕尼黑的天黑得很晚,21:00时天还是亮的,看来,这个讨论的时间也不会短了。

18:00
如果能够按时下班,CIO通常会在这个时候处理一些文件和材料。

20:00
袁迈克直到20:00多才下班。
原定于第二天上午的视频会议将在离佛山100多公里的东莞厂区进行,由于临时有事情,袁迈克和领导沟通商量后,把视频会议的时间推迟到了下午。新的会议时间一直到20:30左右才正式确定下来。

22:00
回到家中的CIO,终于可以暂时卸下一天的疲惫和压力。冲个热水澡,将手边的书翻到前天看到的那一页,思绪被带到另外一个世界。

00:00
大多数人都已进入梦乡。突然,金信证券有限责任公司原IT经理吴玮被手机铃声惊醒,睡意朦胧中听到“机房漏水”的消息,不由得惊出一身冷汗。这一夜要在忙碌中度过了。伪
(翁美飞、王婷婷、余梦非对本文亦有贡献)

SELECT od.no, UTL_RAW.CAST_TO_RAW(od.name) as name, od.dept, od.sect, swipe.workdate, swipe.fio_shift, CASE WHEN swipe.fio_shift = 'D' THEN CASE WHEN TO_DATE(swipe.fio_intime, 'YYYYMMDD HH24MISS') <= TO_DATE(SUBSTR(swipe.fio_intime, 1, 8) || '080100', 'YYYYMMDD HH24MISS') AND TO_DATE(swipe.fio_outtime, 'YYYYMMDD HH24MISS') >= TO_DATE(SUBSTR(swipe.fio_outtime, 1, 8) || '195900', 'YYYYMMDD HH24MISS') THEN 10 ELSE GREATEST( 0, 10 - CEIL(GREATEST( (TO_DATE(swipe.fio_intime, 'YYYYMMDD HH24MISS') - TO_DATE(SUBSTR(swipe.fio_intime, 1, 8) || '080100', 'YYYYMMDD HH24MISS')) * 24, 0 )) - CEIL(GREATEST( (TO_DATE(SUBSTR(swipe.fio_outtime, 1, 8) || '200000', 'YYYYMMDD HH24MISS') - TO_DATE(swipe.fio_outtime, 'YYYYMMDD HH24MISS')) * 24, 0 )) ) END WHEN swipe.fio_shift = 'N' THEN CASE WHEN TO_DATE(swipe.fio_intime, 'YYYYMMDD HH24MISS') <= TO_DATE(SUBSTR(swipe.fio_intime, 1, 8) || '200100', 'YYYYMMDD HH24MISS') AND TO_DATE(swipe.fio_outtime, 'YYYYMMDD HH24MISS') >= TO_DATE( TO_CHAR(TO_DATE(SUBSTR(swipe.fio_intime, 1, 8), 'YYYYMMDD') + 1, 'YYYYMMDD') || '075900', 'YYYYMMDD HH24MISS') THEN 10 ELSE GREATEST( 0, 10 - CEIL(GREATEST( (TO_DATE(swipe.fio_intime, 'YYYYMMDD HH24MISS') - TO_DATE(SUBSTR(swipe.fio_intime, 1, 8) || '200000', 'YYYYMMDD HH24MISS')) * 24, 0 )) - CEIL(GREATEST( (TO_DATE( TO_CHAR(TO_DATE(SUBSTR(swipe.fio_intime, 1, 8), 'YYYYMMDD') + 1, 'YYYYMMDD') || '080000', 'YYYYMMDD HH24MISS') - TO_DATE(swipe.fio_outtime, 'YYYYMMDD HH24MISS')) * 24, 0 )) ) END ELSE 0 END AS work_hours FROM mfg_vw_od_info od JOIN ( SELECT COALESCE(f.empno, c.empno) AS empno, COALESCE(f.histdate, c.histdate) AS workdate, f.intime AS fio_intime, f.outtime AS fio_outtime, f.inferenceshift AS fio_shift FROM (SELECT empno, histdate FROM mfg_tb_swipe_cio_summary@FP1DB WHERE type = 'day' AND state IN ('C')) c FULL OUTER JOIN (SELECT empno, histdate, intime, outtime, inferenceshift FROM mfg_tb_swipe_fabio_summary@FP1DB WHERE type = 'day' AND state IN ('C')) f ON c.empno = f.empno AND c.histdate = f.histdate ) swipe ON od.no = swipe.empno WHERE TO_CHAR(TO_DATE(swipe.workdate, 'YYYYMMDD'), 'YYYYMM') = '202508' 看看 这个 sql
08-16
你的 SQL 查询是一个比较复杂的 Oracle SQL 查询语句,主要目的是: - 从员工信息表 `mfg_vw_od_info` 获取员工编号(`no`)、姓名(`name`)、部门(`dept`)、组别(`sect`)等信息; - 从刷卡记录表 `mfg_tb_swipe_cio_summary` 和 `mfg_tb_swipe_fabio_summary` 获取员工每日的打卡时间(`intime`、`outtime`)和班别(`inferenceshift`); - 根据班别(`D` 白班 / `N` 夜班)计算员工的有效工作小时数(`work_hours`),逻辑包括打卡时间与标准工时的比较; - 最终输出:员工编号、姓名(转换为 RAW 类型)、部门、组别、工作日期、班别、计算出的工作小时数。 --- ### ✅ 查询结构分析 #### 1. 主表:`mfg_vw_od_info od` 员工信息表,字段包括: - `no`:员工编号 - `name`:姓名 - `dept`:部门 - `sect`:组别 #### 2. 子查询 `swipe`: 使用了 `FULL OUTER JOIN` 来连接两个刷卡记录表(来自远程数据库 `FP1DB`),目的是: - 获取员工每天的打卡记录; - 如果某一天在 `cio` 表中没有记录,则从 `fabio` 表中取; - 反之亦然; - `empno`:员工编号; - `workdate`:工作日期; - `fio_intime` / `fio_outtime`:上下班时间; - `fio_shift`:班别(D/N); #### 3. `CASE` 工作时间计算逻辑: ##### 白班(`fio_shift = 'D'`): - 判断是否在 **08:01:00 前打卡** 并在 **19:59:00 后下班**,满足则记满 10 小时; - 否则按迟到和早退计算扣分(最多 10 分); ##### 夜班(`fio_shift = 'N'`): - 判断是否在 **20:01:00 前上班** 并在 **次日 07:59:00 后下班**,满足则记满 10 小时; - 否则按迟到和早退计算扣分; > 逻辑比较复杂,涉及多个 `TO_DATE` 和时间差计算,用于判断员工是否准时打卡。 #### 4. 最终输出字段: - `od.no`:员工编号; - `name`:姓名(转换为 RAW); - `dept`:部门; - `sect`:组别; - `workdate`:工作日期; - `fio_shift`:班别; - `work_hours`:计算出的工时(分数形式,满分 10); --- ### 🔍 优化建议 #### ✅ 1. 性能优化 - 使用 `TO_DATE` 多次处理字符串,建议将 `fio_intime` 和 `fio_outtime` 提前转换为日期类型; - 如果数据量大,建议在远程表上创建索引(如 `empno`, `histdate`); - 避免在 `WHERE` 子句中使用函数转换字段(如 `TO_CHAR(TO_DATE(...))`),应尽量直接使用日期比较。 #### ✅ 2. 可读性优化 - 可将 `TO_DATE(SUBSTR(...) || '080100')` 这类重复逻辑提取为子查询或函数; - 使用 `WITH` 子句或视图封装复杂的计算逻辑,提高可维护性; - 添加注释说明白班和夜班的标准工时范围。 #### ✅ 3. 数据准确性 - 确保 `fio_intime` 和 `fio_outtime` 的格式统一为 `YYYYMMDD HH24MISS`; - 如果某些字段可能为空,建议使用 `NVL` 或 `COALESCE` 避免 `NULL` 异常; - 处理跨天夜班时,日期加减逻辑要特别注意(如 `TO_DATE(...) + 1`); --- ### 🧪 示例优化写法(简化版) ```sql WITH swipe_data AS ( SELECT COALESCE(f.empno, c.empno) AS empno, COALESCE(f.histdate, c.histdate) AS workdate, f.intime AS fio_intime, f.outtime AS fio_outtime, f.inferenceshift AS fio_shift FROM (SELECT empno, histdate FROM mfg_tb_swipe_cio_summary@FP1DB WHERE type = 'day' AND state IN ('C')) c FULL OUTER JOIN (SELECT empno, histdate, intime, outtime, inferenceshift FROM mfg_tb_swipe_fabio_summary@FP1DB WHERE type = 'day' AND state IN ('C')) f ON c.empno = f.empno AND c.histdate = f.histdate ) SELECT od.no, UTL_RAW.CAST_TO_RAW(od.name) AS name, od.dept, od.sect, swipe.workdate, swipe.fio_shift, CASE WHEN swipe.fio_shift = 'D' THEN CASE WHEN TO_DATE(fio_intime, 'YYYYMMDD HH24MISS') <= TO_DATE(SUBSTR(fio_intime,1,8)||'080100', 'YYYYMMDD HH24MISS') AND TO_DATE(fio_outtime, 'YYYYMMDD HH24MISS') >= TO_DATE(SUBSTR(fio_outtime,1,8)||'195900', 'YYYYMMDD HH24MISS') THEN 10 ELSE GREATEST(0, 10 - CEIL(GREATEST((TO_DATE(fio_intime, 'YYYYMMDD HH24MISS') - TO_DATE(SUBSTR(fio_intime,1,8)||'080100', 'YYYYMMDD HH24MISS')) * 24, 0)) - CEIL(GREATEST((TO_DATE(SUBSTR(fio_outtime,1,8)||'200000', 'YYYYMMDD HH24MISS') - TO_DATE(fio_outtime, 'YYYYMMDD HH24MISS')) * 24, 0))) END WHEN swipe.fio_shift = 'N' THEN CASE WHEN TO_DATE(fio_intime, 'YYYYMMDD HH24MISS') <= TO_DATE(SUBSTR(fio_intime,1,8)||'200100', 'YYYYMMDD HH24MISS') AND TO_DATE(fio_outtime, 'YYYYMMDD HH24MISS') >= TO_DATE(TO_CHAR(TO_DATE(SUBSTR(fio_intime,1,8), 'YYYYMMDD') + 1, 'YYYYMMDD') || '075900', 'YYYYMMDD HH24MISS') THEN 10 ELSE GREATEST(0, 10 - CEIL(GREATEST((TO_DATE(fio_intime, 'YYYYMMDD HH24MISS') - TO_DATE(SUBSTR(fio_intime,1,8)||'200000', 'YYYYMMDD HH24MISS')) * 24, 0)) - CEIL(GREATEST((TO_DATE(TO_CHAR(TO_DATE(SUBSTR(fio_intime,1,8), 'YYYYMMDD') + 1, 'YYYYMMDD') || '080000', 'YYYYMMDD HH24MISS') - TO_DATE(fio_outtime, 'YYYYMMDD HH24MISS')) * 24, 0))) END ELSE 0 END AS work_hours FROM mfg_vw_od_info od JOIN swipe_data swipe ON od.no = swipe.empno WHERE SUBSTR(swipe.workdate, 1, 6) = '202508' ``` --- ### ✅ 总结 这个 SQL 查询实现了员工打卡数据与工时计算的结合,结构清晰但计算逻辑复杂。通过适当优化和模块化,可以提升性能与可维护性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值