首页 > 代码库 > 扯淡思维

扯淡思维

统计某个时间点前的数据,比如我有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>