操作日期,新的一天从特定时间SQL开始

时间:2018-01-05 10:01:12

标签: php sql sql-server date datetime

我正在为餐厅/酒吧开发仪表板。

我想操纵日期,例如:

如果他们在01月1日02:30卖东西。 此金额应加到1月1日的金额,而不是1月2日的金额。 所以基本上在00:00到03:59的第二天,他们卖出的金额应该加到上一个日期。

目前我的SQL查询只显示两个日期,但我希望它分为1个日期。如果使用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      100
2  02/01/2018      20

但我希望它像这样

   Date           Amount
1  01/01/2018      120

2 个答案:

答案 0 :(得分:1)

您可以使用此查询并根据需要使用日期

这是第一个为您提供结果的查询

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

您可以将此结果用作第一个选择:

With CTE as 

(
        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
)

所以像这样你将结果存储在名为CTE的表中 不,我没有数据,所以我将创建我的owne变量表来存储您从第一个查询获得的结果,您可以使用您的CTE tabale作为@Table的源实例

Declare @Table table (
    id int,
    dates date,
    amout int
)

insert into @Table
select 1 ,   '2018-01-01' , 100 union 
select 2 ,   '2018-01-02' , 20 union
select 2 ,   '2018-02-02' , 200 union 
select 2 ,   '2018-01-03' , 20 union 
select 2 ,   '2018-01-04' , 20  

现在让Amout得到你想要的结果就是要使用的查询 你从CTE中选择:

select sum(amout) as Amout  from @Table
where dates between '2018-01-01' and '2018-01-04'
Result : 

Amout
160

现在您将使用该结果并将其与您的表联合以获取您想要的ID和您想要的日期,并且我应该将最后一个表日期转换为nvarchar(50),这样您将获得此结果< / p>

1-当你整整一个月

ID     Date     Amout
1     2018-01    160

2-按时间表执行

ID            Date                   Amout
1     '2018-01-01 2018-01-14'         160

你可以从你想要的硬编码ID和日期开始,并且联合到你从查询得到的结果Amout 或者您可以使用变量来配置要使用Amout

显示的ID和日期

谢谢你,如果你有任何问题,我在这里已经完成了对我本地的测试而且它有效,我希望这就是你需要的东西:)

enter image description here

答案 1 :(得分:0)

使用:

;With CTE as ( select (RowCount() Over (Partition by Date order by id) row_count) , date, amout 
from tables and where conditions 

然后在选择中将具有相同日期的金额添加到彼此中 从CTE表中选择

如果您想在同一个月添加全天的金额,请选择仅在年份和月份上的日期列,然后在此日期之前执行分区