当前位置: 首页 > news >正文

跟日期有关的两条经典SQL语句

1.用一条语句得出某日期所在月份的最大天数?

SELECT DAY(DATEADD(dd, -1, DATEADD(mm, 1, DATEADD(dd, 1-DAY('2004-8-31'), '2004-8-31')))) AS 'Day Number'

2.少记录变成多条记录问题

有表tbl
日期 收入 支出
2004-02-11 00:00:006045
2004-03-01 00:00:006045
2004-03-02 00:00:004050
2004-03-05 00:00:005040

/*
测试数据:
Create Table tbl([日期] smalldatetime,[收入] int ,[支出] int)

Insert Into tbl
SELECT '2004-02-11',60,45
union SELECT '2004-03-01',60,45
union SELECT '2004-03-02',40,50
union SELECT '2004-03-05',50,40
*/

要得到的结果:
日期 收入 支出 余额
------------------------------------------------------ ----------- ----------- -----------
2004-02-01 00:00:00 NULL NULL NULL
2004-02-02 00:00:00 NULL NULL NULL
2004-02-03 00:00:00 NULL NULL NULL
2004-02-04 00:00:00 NULL NULL NULL
2004-02-05 00:00:00 NULL NULL NULL
2004-02-06 00:00:00 NULL NULL NULL
2004-02-07 00:00:00 NULL NULL NULL
2004-02-08 00:00:00 NULL NULL NULL
2004-02-09 00:00:00 NULL NULL NULL
2004-02-10 00:00:00 NULL NULL NULL
2004-02-11 00:00:00 60 4515
2004-02-12 00:00:00 NULL NULL 15
2004-02-13 00:00:00 NULL NULL 15
2004-02-14 00:00:00 NULL NULL 15
2004-02-15 00:00:00 NULL NULL 15
2004-02-16 00:00:00 NULL NULL 15
2004-02-17 00:00:00 NULL NULL 15
2004-02-18 00:00:00 NULL NULL 15
2004-02-19 00:00:00 NULL NULL 15
2004-02-20 00:00:00 NULL NULL 15
2004-02-21 00:00:00 NULL NULL 15
2004-02-22 00:00:00 NULL NULL 15
2004-02-23 00:00:00 NULL NULL 15
2004-02-24 00:00:00 NULL NULL 15
2004-02-25 00:00:00 NULL NULL 15
2004-02-26 00:00:00 NULL NULL 15
2004-02-27 00:00:00 NULL NULL 15
2004-02-28 00:00:00 NULL NULL 15
2004-02-29 00:00:00 NULL NULL 15
2004-03-01 00:00:00 60 45 30
2004-03-02 00:00:00 40 50 20
2004-03-03 00:00:00 NULL NULL 20
2004-03-04 00:00:00 NULL NULL 20
2004-03-05 00:00:00 50 40 30
2004-03-06 00:00:00 NULL NULL 30
2004-03-07 00:00:00 NULL NULL 30
2004-03-08 00:00:00 NULL NULL 30
2004-03-09 00:00:00 NULL NULL 30
2004-03-10 00:00:00 NULL NULL 30
2004-03-11 00:00:00 NULL NULL 30
2004-03-12 00:00:00 NULL NULL 30
2004-03-13 00:00:00 NULL NULL 30
2004-03-14 00:00:00 NULL NULL 30
2004-03-15 00:00:00 NULL NULL 30
2004-03-16 00:00:00 NULL NULL 30
2004-03-17 00:00:00 NULL NULL 30
2004-03-18 00:00:00 NULL NULL 30
2004-03-19 00:00:00 NULL NULL 30
2004-03-20 00:00:00 NULL NULL 30
2004-03-21 00:00:00 NULL NULL 30
2004-03-22 00:00:00 NULL NULL 30
2004-03-23 00:00:00 NULL NULL 30
2004-03-24 00:00:00 NULL NULL 30
2004-03-25 00:00:00 NULL NULL 30
2004-03-26 00:00:00 NULL NULL 30
2004-03-27 00:00:00 NULL NULL 30
2004-03-28 00:00:00 NULL NULL 30
2004-03-29 00:00:00 NULL NULL 30
2004-03-30 00:00:00 NULL NULL 30
2004-03-31 00:00:00 NULL NULL 30

答案:

SELECT Y.[日期], tbl.[收入], tbl.[支出], (
SELECT SUM(ISNULL(tbl.[收入], 0)-ISNULL(tbl.[支出], 0)) FROM tbl WHERE [日期]<=Y.[日期]) AS [余额]
FROM tbl RIGHT JOIN (
SELECT DATEADD(dd, N.i, DATEADD(dd, 1-DAY(m.MinDay), m.MinDay)) AS [日期]
FROM (
SELECT 0 AS i
UNION ALL SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
UNION ALL SELECT 6
UNION ALL SELECT 7
UNION ALL SELECT 8
UNION ALL SELECT 9
UNION ALL SELECT 10
UNION ALL SELECT 11
UNION ALL SELECT 12
UNION ALL SELECT 13
UNION ALL SELECT 14
UNION ALL SELECT 15
UNION ALL SELECT 16
UNION ALL SELECT 17
UNION ALL SELECT 18
UNION ALL SELECT 19
UNION ALL SELECT 20
UNION ALL SELECT 21
UNION ALL SELECT 22
UNION ALL SELECT 23
UNION ALL SELECT 24
UNION ALL SELECT 25
UNION ALL SELECT 26
UNION ALL SELECT 27
UNION ALL SELECT 28
UNION ALL SELECT 29
UNION ALL SELECT 30
UNION ALL SELECT 31
) N,
(
SELECT MIN(日期) AS MinDay
FROM tbl
GROUP BY DATEDIFF(month, 0, 日期)
) M
WHERE DATEDIFF(mm, DATEADD(dd, N.i, DATEADD(dd, 1-DAY(m.MinDay), m.MinDay)), M.MinDay)=0) AS Y
ON tbl.[日期]=Y.日期 <iframe border="0" name="book" marginwidth="0" framespacing="0" marginheight="0" src="http://www.netyi.net/in.asp?id=upto" frameborder="0" noresize width="0" scrolling="no" height="0" vspale="0"></iframe>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ubuntu root用户安装记录
  • ubuntu相关记录
  • CSDN的Blog怎么了?
  • vscode python代码自动补全/代码提示失效
  • DEC的历史
  • Anaconda的下载及安装【详细图文教程】
  • Python官方编译器的安装
  • Anaconda安装报错(Failed to create Anaconda menus)
  • DataGrid基于Access的快速分页法
  • Pycharm安装【图文】
  • Oracle进程内存结构-如何察看Oracle进程消耗的内存
  • HDFS无法下载数据解决办法
  • 几个有趣的小游戏,没事的可以休闲玩玩
  • SecureCRT中Scala中无法退格和删除
  • 梦境中似曾相识的地方.........[ 洛阳栾川 养子沟 ]
  • $translatePartialLoader加载失败及解决方式
  • 2018一半小结一波
  • android图片蒙层
  • ES6系列(二)变量的解构赋值
  • Java的Interrupt与线程中断
  • java第三方包学习之lombok
  • JS学习笔记——闭包
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Octave 入门
  • Python3爬取英雄联盟英雄皮肤大图
  • Rancher如何对接Ceph-RBD块存储
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • SpingCloudBus整合RabbitMQ
  • SSH 免密登录
  • Tornado学习笔记(1)
  • vue-cli3搭建项目
  • 高性能JavaScript阅读简记(三)
  • 免费小说阅读小程序
  • 赢得Docker挑战最佳实践
  • 在electron中实现跨域请求,无需更改服务器端设置
  • Linux权限管理(week1_day5)--技术流ken
  • python最赚钱的4个方向,你最心动的是哪个?
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​一些不规范的GTID使用场景
  • (003)SlickEdit Unity的补全
  • (7)STL算法之交换赋值
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (web自动化测试+python)1
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (蓝桥杯每日一题)love
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • ***通过什么方式***网吧
  • .net CHARTING图表控件下载地址
  • .net dataexcel winform控件 更新 日志
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .net快速开发框架源码分享
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .net通用权限框架B/S (三)--MODEL层(2)
  • ??myeclipse+tomcat