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

Posted

技术标签:

【中文标题】操作日期,新的一天从特定时间开始 SQL【英文标题】:Manipulate Date, new day starts at specific time SQL 【发布时间】:2018-01-05 10:01:12 【问题描述】:

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

我想操作日期,例如:

如果他们在 1 月 2 日 ,01h30 卖东西。 该金额应添加到 1 月 1 日的金额中,而不是 1 月 2 日的金额中。 所以基本上在第二天从 00h00 到 03h59,他们卖出的数量,应该加到前一个日期。

目前,我的 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

【问题讨论】:

【参考方案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 的表中 现在我没有数据,所以我将创建自己的变量表来存储您从第一个查询中获得的结果,您可以使用您的 CTE 表格作为@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),这样您就会得到这个结果

1- 当你做整个月时

ID     Date     Amout
1     2018-01    160

2- 当你按时间完成时

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

您可以根据需要对 ID 和 Date 进行硬编码,并且 union 是您从查询中获得的结果 Amout 或者你可以做变量来配置你想用 Amout 显示的 ID 和日期

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

【讨论】:

如果您希望在需要调试时更清楚地使用 CTE 表,您还可以将第一个查询结果存储到临时数据库或变量数据库中 感谢您的精彩解释!工作正常!【参考方案2】:

使用:

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

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

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

【讨论】:

会尽快测试,当我选择一周的时间范围时,这是否也有效? 是的,我会在第二个回答上给你一个简单的经验

以上是关于操作日期,新的一天从特定时间开始 SQL的主要内容,如果未能解决你的问题,请参考以下文章

在特定时区的一天开始时获取时间对象

使用Python做一个语音播报温湿度系统,元气满满的一天从听到他开始

使用Python做一个语音播报温湿度系统,元气满满的一天从听到他开始

使用Python做一个语音播报温湿度系统,元气满满的一天从听到他开始

Java8 日期时间API

星期天蜂巢开始一周?