Crystal Reports中Varchar日期时间字段合并为Datetime并排序问询
在Crystal Reports中合并日期+时间字段并实现排序的可行方案
刚好我之前踩过这个坑,Crystal Reports的日期时间转换逻辑和SQL确实不太一样,直接照搬SQL的写法容易报错。下面给你两种靠谱的解决思路:
方案一:用Crystal Reports公式字段处理(推荐)
这种方式不需要修改数据源,直接在报表里做字段合并:
- 打开「字段资源管理器」,右键「公式字段」→「新建」,命名比如
Full_Scheduled_Datetime - 在公式编辑器里写这段代码:
// 先把NULL的时间转成默认的凌晨0点,避免转换失败 Local StringVar cleanTime := If IsNull({你的表名.SCHEDULED_TIME}) Then "12:00:00 AM" Else {你的表名.SCHEDULED_TIME}; // 合并日期和时间成DateTime类型 CDate({你的表名.SCHEDULED_DATE}) + CTime(cleanTime)
小提示:
CDate()会自动从带时间的日期字符串里提取纯日期部分(比如2018-04-26 00:00:00.000会被转成2018-04-26)CTime()完全支持识别AM/PM格式的时间字符串,不用担心转换问题- 如果你的业务里NULL时间需要特殊处理(比如按当天最后时间算),把
"12:00:00 AM"改成"11:59:59 PM"就行
- 排序设置:点击顶部「报表」→「排序专家」,把这个新的公式字段加到排序列表里,选好升序/降序就搞定了
方案二:在数据源SQL里预处理数据
如果你更习惯用SQL来处理,直接在Crystal的数据源里用SQL命令(别直接选表),提前把合并后的字段算好:
SELECT SCHEDULED_DATE, SCHEDULED_TIME, -- 处理NULL时间,合并成DateTime CONVERT(DATETIME, SCHEDULED_DATE + ' ' + ISNULL(SCHEDULED_TIME, '00:00:00')) AS Full_Scheduled_Datetime FROM 你的表名
然后在报表里直接用Full_Scheduled_Datetime字段排序就行,这种方式把计算逻辑丢给数据库,报表端更省心。
踩坑提醒
如果遇到转换报错,大概率是SCHEDULED_TIME里有格式不统一的脏数据(比如有的记录缺AM/PM,或者是24小时制但Crystal识别不了),这时候可以在公式里加个容错:比如用TimeValue()替代CTime(),或者先把时间字符串统一转成24小时格式再转换。
内容的提问来源于stack exchange,提问作者Collin
相关产品推荐
相关产品推荐

