Php 操纵日期,新日期在特定时间开始SQL
我正在为一家餐厅/酒吧开发一个仪表板 我想操纵日期,例如: 如果他们在1月2日01时30分卖出某物。 该金额应添加到1月1日的金额中,而不是添加到1月2日的金额中。 所以基本上在第二天从00点到03点,他们卖出的数量应该加到前一天 目前,我的SQL查询只显示两个日期,但我希望将其分组为一个日期。如果SQL不能做到这一点,我的仪表板是用PHP编写的,所以如果有人能提供这些信息,我最终可以用PHP来操作仪表板 我的问题Php 操纵日期,新日期在特定时间开始SQL,php,sql,sql-server,date,datetime,Php,Sql,Sql Server,Date,Datetime,我正在为一家餐厅/酒吧开发一个仪表板 我想操纵日期,例如: 如果他们在1月2日01时30分卖出某物。 该金额应添加到1月1日的金额中,而不是添加到1月2日的金额中。 所以基本上在第二天从00点到03点,他们卖出的数量应该加到前一天 目前,我的SQL查询只显示两个日期,但我希望将其分组为一个日期。如果SQL不能做到这一点,我的仪表板是用PHP编写的,所以如果有人能提供这些信息,我最终可以用PHP来操作仪表板 我的问题 select CONVERT(CHAR(10), receiptdatetime
select CONVERT(CHAR(10), receiptdatetime, 120), datename(DW,receiptdatetime),
sum(rld.NetAmount), count(rl.ReceiptId)
from receipt r, receiptline rl, vw_ReceiptLineDetail rld
where rl.ReceiptId = r.ReceiptId and
rl.ModifiedKind != 300
and rld.ReceiptLineId = rl.ReceiptLineId and
receiptdatetime <= DATEADD(HOUR,4,DATEADD(DAY,1, '01/01/2018'))
and receiptdatetime >= DATEADD(HOUR,4,'01/01/2018')
group by CONVERT(CHAR(10), receiptdatetime, 120), datename(DW, receiptdatetime)
order by 1
但我想要这样
Date Amount
1 01/01/2018 120
使用:
;With CTE as ( select (RowCount() Over (Partition by Date order by id) row_count) , date, amout
from tables and where conditions
然后在屏幕上选择将具有相同日期的金额添加到其他金额中
从CTE表中选择
如果要添加同一个月的全天金额,请仅选择“日期年”和“日期月”列,然后在此日期上按进行分区您可以使用此查询并根据需要处理日期 这是给出该结果的第一个查询
select CONVERT(CHAR(10), receiptdatetime, 120), datename(DW,receiptdatetime),
sum(rld.NetAmount), count(rl.ReceiptId)
from receipt r, receiptline rl, vw_ReceiptLineDetail rld
where rl.ReceiptId = r.ReceiptId and
rl.ModifiedKind != 300
and rld.ReceiptLineId = rl.ReceiptLineId and
receiptdatetime <= DATEADD(HOUR,4,DATEADD(DAY,1, '01/01/2018'))
and receiptdatetime >= DATEADD(HOUR,4,'01/01/2018')
group by CONVERT(CHAR(10), receiptdatetime, 120), datename(DW, receiptdatetime)
order by 1
现在,要获得所需结果的Amout,这里是要使用的查询
您可以从CTE中选择:
select sum(amout) as Amout from @Table
where dates between '2018-01-01' and '2018-01-04'
现在,您将使用该结果并将其与您的表合并,以获得所需的ID和所需的日期,并且您应该将最后一个表日期转换为nvarchar50,这样您将得到此结果
1-当你整个月都在做
ID Date Amout
1 2018-01 160
2-当你按时间段进行时
ID Date Amout
1 '2018-01-01 2018-01-14' 160
您可以根据需要对ID和日期进行硬编码,并将union与从查询中获得的结果进行比较
或者,您可以使用变量来配置要用Amout显示的ID和日期
谢谢,如果你有任何问题,我在这里,我已经在我的本地计算机上完成了测试,它工作正常,我希望这就是你需要的:
将尽快对此进行测试,当我选择一周的时间段时,这也会起作用吗?是的,我会在secend Answare上为您提供一个简单的exp。如果您不想使用CTE表,而是想在调试时更加清楚,您还可以将第一个查询结果存储到Temp DB或variable DB中。感谢您的精彩解释!它应该工作!
select sum(amout) as Amout from @Table
where dates between '2018-01-01' and '2018-01-04'
Result :
Amout
160
ID Date Amout
1 2018-01 160
ID Date Amout
1 '2018-01-01 2018-01-14' 160