操作日期,新的一天从特定时间开始 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做一个语音播报温湿度系统,元气满满的一天从听到他开始