zoukankan      html  css  js  c++  java
  • 扯淡思维

    统计某个时间点前的数据,比如我有10W条数据,包括加班的数据,但我要统计下午5:00前的数据。你第一时间想到的是什么方法呢?

    表:tableA

    表示时间的字段名称:alltime,字段类型为nvarchar()或者datetime,smalldatetime

    以简单的smalldatetiem为例吧:

    select *
    from tableA
    where alltime<'[0-9][0-9][0-9][0-9][0-9][0-9]-0-9][0-9]17'

    上面这语句看上去符合逻辑,我用通配符匹配到每年的每月每天的17点,也就是小于17点的所有行了。

    实际上结果是不对的,我后来想到了,就是因为匹配了每年的每月每天,所以不可能有那个时间比每年最小年份最小月份最小天的17点小的了(得出的结果应该是你定义的字段类型时间范围内最小的年月日的0点到17点之间,smalldatetime的日期范围从1900年1月1日到2079年6月6日,结果应该是1900年1月1日17点前的数据)。

    select * 
    from tableA
    where datepart(hh,alltime)<'17'

    SQL Server 提供了返回日期的部分的函数,就是datepart()。

    nvarchar类型的保存的日期,格式类似:2014-01-09 15:23:09

    直接用datepart也没问题,应该是nvarchar隐式转化为datetime类型了。

    当然也可以用substring取空格和第一个’:’之间的那个数值

    select *
    from tableA
    where substring(alltime,charindex(' ',alltime)+1,CHARINDEX(':',alltime)-charindex(' ',alltime)-1)<'17'

    以上都不考虑性能,where条件中执行运算肯定对性能有影响;如果某个需求你技术都没法实现,考虑性能纯粹是扯淡。

    思维比技术重要,当然前提是要有技术基础,要不思维应该也无从谈起。有思维再查是否有相关的技术。

    有时想想挺好玩的,有datepart函数,也有在语法中写datepart的,比如datediff()的语法:

    DATEDIFF(datepart,startdate,enddate)

    这里的datepart就是yy,mm,hh之类的。

    datepart字面意思就是日期的部分,date和part两个单词的组合。虽然是相同的单词组合,意义不同,以前我看见datediff函数的语法,还搞不明白,为毛是datepart啊?

  • 相关阅读:
    bzoj1098: [POI2007]办公楼biu
    codeforce1070 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred) 题解
    南京大学发布无序列限制的DNA编辑新工具(转自生物通)
    Matlab界面清洗
    二硫化铼(ReS2)的电子输运特性及逻辑器件研究进展
    java中数据字典的使用:
    表单的重复提交,解决方案
    java中常量文件的配置与读取
    java中生成验证码,以及验证码的使用
    邮箱验证,工具类
  • 原文地址:https://www.cnblogs.com/cnmarkao/p/3822590.html
Copyright © 2011-2022 走看看