原文:在论坛中出现的比较难的sql问题:24(生成时间段)


最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。

所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。

1、请问我这样的需求如何实现,看示很简单的问题,实现起来很复杂吗?

现在是这样的问题了


  1. USE tempdb
  2. IF OBJECT_ID('TEST') IS NOT NULL
  3. DROP TABLE TEST; --> 如果表TEST不为空,删除表
  4. GO
  5. CREATE TABLE TEST --> 创建表,字段及类型如下
  6. (
  7. CalID varchar(20), --> 编号
  8. CalDate datetime, --> 日期字段
  9. CalStime datetime, --> 时间字段
  10. CalEtime datetime, --> 机器号
  11. CalBZ varchar(10) --> 这是机器要求的时间间隔字段,单位分钟
  12. );
  13. GO
  14. INSERT TEST --> 向表中插入数据
  15. select 'A01','2011-03-13 00:00:00.000','00:00:00.000','06:59:00.000','丙' union all
  16. select 'A01','2011-03-13 00:00:00.000','07:00:00.000','14:59:00.000','甲' union all
  17. select 'A01','2011-03-13 00:00:00.000','15:00:00.000','21:59:00.000','乙' union all
  18. select 'A01','2011-03-13 00:00:00.000','22:00:00.000','23:59:00.000','丁'
  19. GO
  20. SELECT * FROM TEST; --> 表的结构如下
  21. GO
  22. /*
  23. CalID CalDate CalStime CalEtime CalBZ
  24. -------------------- ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ----------
  25. A01 2011-03-13 00:00:00.000 1900-01-01 00:00:00.000 1900-01-01 06:59:00.000 丙
  26. A01 2011-03-13 00:00:00.000 1900-01-01 07:00:00.000 1900-01-01 14:59:00.000 甲
  27. A01 2011-03-13 00:00:00.000 1900-01-01 15:00:00.000 1900-01-01 21:59:00.000 乙
  28. A01 2011-03-13 00:00:00.000 1900-01-01 22:00:00.000 1900-01-01 23:59:00.000 丁
  29. */
  30. --怎么得到以下结果?
  31. /*
  32. A01 2011-03-13 00:00 2011-03-13 00:29 丙
  33. A01 2011-03-13 00:30 2011-03-13 00:59 丙
  34. A01 2011-03-13 01:00 2011-03-13 01:29 丙
  35. A01 2011-03-13 01:30 2011-03-13 01:59 丙
  36. .....以此类推
  37. A01 2011-03-13 23:00 2011-03-13 23:29 丁
  38. A01 2011-03-13 23:30 2011-03-13 23:59 丁
  39. */

简单的说,就是如何把表中一个时间范围分段成若干个小时间段?在sql server 2000系统中。

我的方法:


  1. select CalID,
  2. DATEADD(minute,30*number,cal_stime) calStime,
  3. DATEADD(minute,30*(number+1)-1,cal_stime) calEtime,
  4. --Cal_Stime,
  5. --Cal_Etime,
  6. --number,
  7. CalBZ
  8. from
  9. (
  10. select *,
  11. convert(varchar(11),CalDate,120)+CONVERT(varchar(5),CalStime,108) Cal_Stime,
  12. convert(varchar(11),CalDate,120)+CONVERT(varchar(5),CalEtime,108) Cal_Etime
  13. from TEST
  14. )t,master..spt_values s
  15. where s.type = 'P'
  16. and s.number >=0
  17. and DATEADD(MINUTE,30*number,Cal_Stime) <=Cal_Etime
  18. /*
  19. CalID calStime calEtime CalBZ
  20. A01 2011-03-13 00:00:00.000 2011-03-13 00:29:00.000 丙
  21. A01 2011-03-13 00:30:00.000 2011-03-13 00:59:00.000 丙
  22. A01 2011-03-13 01:00:00.000 2011-03-13 01:29:00.000 丙
  23. A01 2011-03-13 01:30:00.000 2011-03-13 01:59:00.000 丙
  24. A01 2011-03-13 02:00:00.000 2011-03-13 02:29:00.000 丙
  25. A01 2011-03-13 02:30:00.000 2011-03-13 02:59:00.000 丙
  26. A01 2011-03-13 03:00:00.000 2011-03-13 03:29:00.000 丙
  27. A01 2011-03-13 03:30:00.000 2011-03-13 03:59:00.000 丙
  28. A01 2011-03-13 04:00:00.000 2011-03-13 04:29:00.000 丙
  29. A01 2011-03-13 04:30:00.000 2011-03-13 04:59:00.000 丙
  30. A01 2011-03-13 05:00:00.000 2011-03-13 05:29:00.000 丙
  31. A01 2011-03-13 05:30:00.000 2011-03-13 05:59:00.000 丙
  32. A01 2011-03-13 06:00:00.000 2011-03-13 06:29:00.000 丙
  33. A01 2011-03-13 06:30:00.000 2011-03-13 06:59:00.000 丙
  34. A01 2011-03-13 07:00:00.000 2011-03-13 07:29:00.000 甲
  35. A01 2011-03-13 07:30:00.000 2011-03-13 07:59:00.000 甲
  36. A01 2011-03-13 08:00:00.000 2011-03-13 08:29:00.000 甲
  37. A01 2011-03-13 08:30:00.000 2011-03-13 08:59:00.000 甲
  38. A01 2011-03-13 09:00:00.000 2011-03-13 09:29:00.000 甲
  39. A01 2011-03-13 09:30:00.000 2011-03-13 09:59:00.000 甲
  40. A01 2011-03-13 10:00:00.000 2011-03-13 10:29:00.000 甲
  41. A01 2011-03-13 10:30:00.000 2011-03-13 10:59:00.000 甲
  42. A01 2011-03-13 11:00:00.000 2011-03-13 11:29:00.000 甲
  43. A01 2011-03-13 11:30:00.000 2011-03-13 11:59:00.000 甲
  44. A01 2011-03-13 12:00:00.000 2011-03-13 12:29:00.000 甲
  45. A01 2011-03-13 12:30:00.000 2011-03-13 12:59:00.000 甲
  46. A01 2011-03-13 13:00:00.000 2011-03-13 13:29:00.000 甲
  47. A01 2011-03-13 13:30:00.000 2011-03-13 13:59:00.000 甲
  48. A01 2011-03-13 14:00:00.000 2011-03-13 14:29:00.000 甲
  49. A01 2011-03-13 14:30:00.000 2011-03-13 14:59:00.000 甲
  50. A01 2011-03-13 15:00:00.000 2011-03-13 15:29:00.000 乙
  51. A01 2011-03-13 15:30:00.000 2011-03-13 15:59:00.000 乙
  52. A01 2011-03-13 16:00:00.000 2011-03-13 16:29:00.000 乙
  53. A01 2011-03-13 16:30:00.000 2011-03-13 16:59:00.000 乙
  54. A01 2011-03-13 17:00:00.000 2011-03-13 17:29:00.000 乙
  55. A01 2011-03-13 17:30:00.000 2011-03-13 17:59:00.000 乙
  56. A01 2011-03-13 18:00:00.000 2011-03-13 18:29:00.000 乙
  57. A01 2011-03-13 18:30:00.000 2011-03-13 18:59:00.000 乙
  58. A01 2011-03-13 19:00:00.000 2011-03-13 19:29:00.000 乙
  59. A01 2011-03-13 19:30:00.000 2011-03-13 19:59:00.000 乙
  60. A01 2011-03-13 20:00:00.000 2011-03-13 20:29:00.000 乙
  61. A01 2011-03-13 20:30:00.000 2011-03-13 20:59:00.000 乙
  62. A01 2011-03-13 21:00:00.000 2011-03-13 21:29:00.000 乙
  63. A01 2011-03-13 21:30:00.000 2011-03-13 21:59:00.000 乙
  64. A01 2011-03-13 22:00:00.000 2011-03-13 22:29:00.000 丁
  65. A01 2011-03-13 22:30:00.000 2011-03-13 22:59:00.000 丁
  66. A01 2011-03-13 23:00:00.000 2011-03-13 23:29:00.000 丁
  67. A01 2011-03-13 23:30:00.000 2011-03-13 23:59:00.000 丁
  68. */

2、如何取0点开始至今的时间段集合, 间隔1小时

http://bbs.csdn.net/topics/390706187

如题:如何取0点开始至今的时间段集合, 间隔1小时

 0:00 - 1:00

 1:00 - 2:00

 ...

23:00 - 0:00

下面的代码产生的是纯时间段,不过不好用:


  1. select convert(varchar(10),getdate(),120) '当天日期',
  2. convert(varchar(5),dateadd(hour,s.number,convert(varchar(10),getdate(),120)),108)+'-'+
  3. convert(varchar(5),dateadd(hour,s.number+1,convert(varchar(10),getdate(),120)),108) '时间段'
  4. from master..spt_values s
  5. where s.type = 'P' and s.number <= 23
  6. /*
  7. 当天日期 时间段
  8. 2014-02-11 00:00-01:00
  9. 2014-02-11 01:00-02:00
  10. 2014-02-11 02:00-03:00
  11. 2014-02-11 03:00-04:00
  12. 2014-02-11 04:00-05:00
  13. 2014-02-11 05:00-06:00
  14. 2014-02-11 06:00-07:00
  15. 2014-02-11 07:00-08:00
  16. 2014-02-11 08:00-09:00
  17. 2014-02-11 09:00-10:00
  18. 2014-02-11 10:00-11:00
  19. 2014-02-11 11:00-12:00
  20. 2014-02-11 12:00-13:00
  21. 2014-02-11 13:00-14:00
  22. 2014-02-11 14:00-15:00
  23. 2014-02-11 15:00-16:00
  24. 2014-02-11 16:00-17:00
  25. 2014-02-11 17:00-18:00
  26. 2014-02-11 18:00-19:00
  27. 2014-02-11 19:00-20:00
  28. 2014-02-11 20:00-21:00
  29. 2014-02-11 21:00-22:00
  30. 2014-02-11 22:00-23:00
  31. 2014-02-11 23:00-00:00
  32. */

这个是产生日期时间段,比较实用:


  1. if OBJECT_ID('tempdb..#seTable') is not null
  2. drop table #seTable
  3. create table #seTable(starTime nvarchar(40),endTime nvarchar(40))
  4. insert into #seTable
  5. select --convert(varchar(10),getdate(),120) curr_date,
  6. convert(nvarchar(19),dateadd(hour,s.number,convert(varchar(10),getdate(),120)),120) start_date,
  7. convert(nvarchar(19),dateadd(hour,s.number+1,convert(varchar(10),getdate(),120)),120) end_date
  8. from master..spt_values s
  9. where s.type = 'P' and s.number <= 23
  10. select *
  11. from #seTable
  12. /*
  13. starTime endTime
  14. 2014-02-11 00:00:00 2014-02-11 01:00:00
  15. 2014-02-11 01:00:00 2014-02-11 02:00:00
  16. 2014-02-11 02:00:00 2014-02-11 03:00:00
  17. 2014-02-11 03:00:00 2014-02-11 04:00:00
  18. 2014-02-11 04:00:00 2014-02-11 05:00:00
  19. 2014-02-11 05:00:00 2014-02-11 06:00:00
  20. 2014-02-11 06:00:00 2014-02-11 07:00:00
  21. 2014-02-11 07:00:00 2014-02-11 08:00:00
  22. 2014-02-11 08:00:00 2014-02-11 09:00:00
  23. 2014-02-11 09:00:00 2014-02-11 10:00:00
  24. 2014-02-11 10:00:00 2014-02-11 11:00:00
  25. 2014-02-11 11:00:00 2014-02-11 12:00:00
  26. 2014-02-11 12:00:00 2014-02-11 13:00:00
  27. 2014-02-11 13:00:00 2014-02-11 14:00:00
  28. 2014-02-11 14:00:00 2014-02-11 15:00:00
  29. 2014-02-11 15:00:00 2014-02-11 16:00:00
  30. 2014-02-11 16:00:00 2014-02-11 17:00:00
  31. 2014-02-11 17:00:00 2014-02-11 18:00:00
  32. 2014-02-11 18:00:00 2014-02-11 19:00:00
  33. 2014-02-11 19:00:00 2014-02-11 20:00:00
  34. 2014-02-11 20:00:00 2014-02-11 21:00:00
  35. 2014-02-11 21:00:00 2014-02-11 22:00:00
  36. 2014-02-11 22:00:00 2014-02-11 23:00:00
  37. 2014-02-11 23:00:00 2014-02-12 00:00:00
  38. */
发布了416 篇原创文章 · 获赞 135 · 访问量 94万+

在论坛中出现的比较难的sql问题:24(生成时间段)的更多相关文章

  1. 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)

    原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  2. 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)

    原文:在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时.分钟计算问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...

  3. 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)

    原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...

  4. 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)

    原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  5. 在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字)

    原文:在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  6. 在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)

    原文:在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  7. 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)

    原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...

  8. 在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)

    原文:在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ...

  9. 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)

    原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  10. 在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串)

    原文:在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

随机推荐

  1. kotlin中val和var的区别

    var: var是一个可变变量,这是一个可以通过重新分配来更改为另一个值的变量.这种声明变量的方式和Java中声明变量的方式一样.val: val是一个只读变量,这种声明变量的方式相当于java中的f ...

  2. 基本使用——OkHttp3详细使用教程

    基本使用——OkHttp3详细使用教程 转 https://blog.csdn.net/xx326664162/article/details/77714126 概述 OkHttp现在应该算是最火的H ...

  3. Mapbox显示地图案例

    mapbox地图入门案例 <!DOCTYPE html> <html> <head> <meta charset='utf-8' /> <titl ...

  4. org.openqa.selenium.WebDriverException: unknown error: call function result missing 'value'

    原因:浏览器和驱动版本不匹配 https://npm.taobao.org/mirrors/chromedriver

  5. log4net示例2-日志输入存入Access(转)

    需求:基于log4net组建,创建Console程序将日志输出到Access数据库. 具体实施: (1)创建控制台程序. (2)控制台程序中,添加一个纯文本文件,文件命名为“log-Access.se ...

  6. Go micro 开发微服务步骤

    1.写 proto文件,定义接口和服务 2.实现 接口,注册 handle 3.调用服务:直接用rpc 客户端调用,或者用 api http web等调用 api http web 等服务可以对客户端 ...

  7. [Google] 人和自行车匹配

    2D平面上,有m个人(P),n辆自行车(B),还有空白(O)满足以下条件1.m < n. 2.不存在两个人,到同一辆自行车距离相等, 距离用abs(x1-x2) + abs(y1-y2)定义3. ...

  8. docker之容器日志存储位置及把运行日志记录至文件

    参考:https://www.cnblogs.com/YatHo/p/7866029.html docker启动后日志会在以下位置 /var/lib/docker/containers/容器ID/容器 ...

  9. RF之条件判断、初始化清除-4

    条件判断:        rf中用run keyword if 关键字做条件判断,以此来达到类似在python中if ...else...条件判断的功能. 注意:ELSE IF一定都是大写的,不然运行 ...

  10. nohup 后台运行脚本,且可以实时查看日志

    -u加在python上 python命令加上-u(unbuffered)参数后会强制其标准输出也同标准错误一样不通过缓存直接打印到屏幕. 这是因为python的缓存机制所决定的 如果是使用 nohup ...