Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 操纵日期,新日期在特定时间开始SQL_Php_Sql_Sql Server_Date_Datetime - Fatal编程技术网

Php 操纵日期,新日期在特定时间开始SQL

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

我正在为一家餐厅/酒吧开发一个仪表板

我想操纵日期,例如:

如果他们在1月2日01时30分卖出某物。 该金额应添加到1月1日的金额中,而不是添加到1月2日的金额中。 所以基本上在第二天从00点到03点,他们卖出的数量应该加到前一天

目前,我的SQL查询只显示两个日期,但我希望将其分组为一个日期。如果SQL不能做到这一点,我的仪表板是用PHP编写的,所以如果有人能提供这些信息,我最终可以用PHP来操作仪表板

我的问题

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