首页 > 代码库 > 扯淡思维
扯淡思维
统计某个时间点前的数据,比如我有10W条数据,包括加班的数据,但我要统计下午5:00前的数据。你第一时间想到的是什么方法呢?
表:tableA
表示时间的字段名称:alltime,字段类型为nvarchar()或者datetime,smalldatetime
以简单的smalldatetiem为例吧:
select *from tableAwhere alltime<‘[0-9][0-9][0-9][0-9][0-9][0-9]-0-9][0-9]17‘<style></style>
上面这语句看上去符合逻辑,我用通配符匹配到每年的每月每天的17点,也就是小于17点的所有行了。
实际上结果是不对的,我后来想到了,就是因为匹配了每年的每月每天,所以不可能有那个时间比每年最小年份最小月份最小天的17点小的了(得出的结果应该是你定义的字段类型时间范围内最小的年月日的0点到17点之间,smalldatetime的日期范围从1900年1月1日到2079年6月6日,结果应该是1900年1月1日17点前的数据)。
select * from tableAwhere datepart(hh,alltime)<‘17‘
SQL Server 提供了返回日期的部分的函数,就是datepart()。
nvarchar类型的保存的日期,格式类似:2014-01-09 15:23:09
直接用datepart也没问题,应该是nvarchar隐式转化为datetime类型了。
当然也可以用substring取空格和第一个’:’之间的那个数值
select *from tableAwhere substring(alltime,charindex(‘ ‘,alltime)+1,CHARINDEX(‘:‘,alltime)-charindex(‘ ‘,alltime)-1)<‘17‘<style></style><style></style>
以上都不考虑性能,where条件中执行运算肯定对性能有影响;如果某个需求你技术都没法实现,考虑性能纯粹是扯淡。
思维比技术重要,当然前提是要有技术基础,要不思维应该也无从谈起。有思维再查是否有相关的技术。
有时想想挺好玩的,有datepart函数,也有在语法中写datepart的,比如datediff()的语法:
DATEDIFF(datepart,startdate,enddate)
这里的datepart就是yy,mm,hh之类的。
datepart字面意思就是日期的部分,date和part两个单词的组合。虽然是相同的单词组合,意义不同,以前我看见datediff函数的语法,还搞不明白,为毛是datepart啊?
<style></style>