需求背景:
报表开发中遇到遇到日期时间的处理。
- 底层数据表中,有两个业务时间字典:A时间点(为过滤条件),B时间点;
- 报表中数据查询也有两个日期,为日期区间,starttime(开始日期)、endtime(截至日期)。
需求解析:
- A时间点在报表查询的日期starttime、endtime区间内;
- B时间点可能为空,需要特殊处理;
- 要筛选出A时间点在B时间点之前的数据;
- A时间点、B时间点为业务发生时间,为带具体时间点的时间字段,到时分秒粒度;
- starttime、endtime为日期区间,没有实际的时间点,只到日期粒度。
需求开发:
1、要筛选出A时间点在B时间点之前的数据,但B时间点可能为空,需要特殊处理
where A < (case when B is NULL THEN A+1 ELSE B END )
2、A时间点在报表查询的日期starttime、endtime区间内,且A为时分秒粒度,starttime、endtime为日期粒度
思考1:
A字段为时分秒,同时将starttime字段拼接0时0点0分0秒,将endtime拼接24时0分0秒。再将A字段与拼接后的字段做比较筛选。
Where a between convert(datetime, convert(varchar(10),starttime,120) + ' 00:00:00.000') and convert(datetime, convert(varchar(10),endtime,120) + ' 23:59:59.99')
思考2:
A字段去除时分秒,去除后,与starttime、endtime做比较筛选。
Where Convert(datetime,convert(varchar(10),A,120)) between starttime and endtime
相关解释:
convert:
CONVERT() 函数是把日期转换为新数据类型的通用函数。
CONVERT() 函数可以用不同的格式显示日期/时间数据。
语法
CONVERT(data_type(length),data_to_be_converted,style)
Between and
操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
SQL BETWEEN 语法
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2