首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于时间范围计算金额的SQL查询

基于时间范围计算金额的SQL查询
EN

Stack Overflow用户
提问于 2019-05-06 06:57:43
回答 3查看 630关注 0票数 2

我需要帮助,根据时间范围计算金额。另外,还需要计算出整个月的时间。它是一种基于签入日期的移位事务计算。

转换01/05/2019开始于8:00,结束于02/05/2019 07:59:59这是我的sql。

代码语言:javascript
运行
复制
Select CONVERT(char(10), IsNull(CheckInDate, DateCheckIn), 120) Date, 
SUM(P.Amount - B.TourismTaxAmount) Amount 
From Bookings B 
Inner Join BookingPayments BP On B.ID = BP.BookingID 
Inner Join Payments P On P.ID = BP.PaymentID 
Where BookingStatus IN (2,3,4,6) and 
IsNull(CheckInDate, DateCheckIn) >= '2019-05-01 08:00:00' and
IsNull(CheckInDate, DateCheckIn) <= '2019-05-02 07:59:59'  
group by CONVERT(char(10), IsNull(CheckInDate, DateCheckIn), 120) 
order by CONVERT(char(10), IsNull(CheckInDate, DateCheckIn), 120) 

输出如下:

代码语言:javascript
运行
复制
-------------------------
| Date         | Amount |
-------------------------
| 2019-05-01   | 123.00 |
| 2019-05-02   | 456.00 |
-------------------------

这个SQL已经是正确的。但是,如何使输出如下:

代码语言:javascript
运行
复制
-------------------------
| Date         | Amount |
-------------------------
| 2019-05-01   | 579.00 |
-------------------------

从上面..。我需要按日期和产出生成每月轮班汇总如下:

代码语言:javascript
运行
复制
-------------------------
| Date         | Amount |
-------------------------
| 2019-05-01   | 579.00 |
| 2019-05-02   | 891.00 |
| 2019-05-03   | 721.00 |
| ..........   | .....  |
| ..........   | .....  |
-------------------------

感谢你的帮助和解决方案。谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-06 10:59:47

在进行聚合前8小时减去。您可以最容易地使用所需的日期表达式定义变量(好,列),结果是:

代码语言:javascript
运行
复制
Select convert(char(10), v.dte, 120) as Date, 
       sum(P.Amount - B.TourismTaxAmount) as Amount 
From Bookings B Inner Join
     BookingPayments BP
     On B.ID = BP.BookingID Inner Join
     Payments P
     On P.ID = BP.PaymentID cross apply
     (values (convert(date, dateadd(hour, -8, coalesce(CheckInDate, DateCheckIn))))
     ) v(dte)
Where BookingStatus in (2, 3, 4, 6) and 
      v.dte >= '2019-05-01' and
      v.dte < '2019-05-02'  
group by v.dte 
order by v.dte;

这也很容易扩展到多个日期或几个月。

票数 1
EN

Stack Overflow用户

发布于 2019-05-06 07:00:12

使用按日期排序的窗口函数sum()

代码语言:javascript
运行
复制
Select CONVERT(char(10), IsNull(CheckInDate, DateCheckIn), 120) Date, 
SUM(P.Amount - B.TourismTaxAmount) over(order by CONVERT(char(10), IsNull(CheckInDate, DateCheckIn), 120)) Amount 
From Bookings B 
Inner Join BookingPayments BP On B.ID = BP.BookingID 
Inner Join Payments P On P.ID = BP.PaymentID 
Where BookingStatus IN (2,3,4,6) and 
IsNull(CheckInDate, DateCheckIn) >= '2019-05-01 08:00:00' and
IsNull(CheckInDate, DateCheckIn) <= '2019-05-02 07:59:59'  

order by CONVERT(char(10), IsNull(CheckInDate, DateCheckIn), 120) 
票数 1
EN

Stack Overflow用户

发布于 2019-05-06 07:03:42

对于Server,我将首先创建一个SQL,它以正确的格式将日期列与

代码语言:javascript
运行
复制
Select Year(myDate)*10000+Month(myDate)*100+Day(myDate) as MyNewDate ...

如果您通过WITH在CTE中使用查询,则更容易对其进行分组。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56000179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档