取一个范围日期的数据,如何写SQL

钛元素 2018-12-10 03:41:39
有一个需求,就是要求取每日的金额,我已经取出来了。但是要求取每日的金额有一个创建日期的范围是(昨日16:00-今日15:59)的金额,不知道怎么写了,help!


--从出库单查询业务部门每日统计-国际业务部
SELECT F.ADMIN_UNIT_NAME AS [部门], CONVERT(VARCHAR(20),A.DOC_DATE,120) AS [日期], SUM(B.BUSINESS_QTY * C.PRICE) AS [金额]
FROM dbo.SALES_ISSUE A LEFT JOIN dbo.SALES_ISSUE_D B ON B.SALES_ISSUE_ID = A.SALES_ISSUE_ID
LEFT JOIN dbo.SALES_DELIVERY_D C ON B.SOURCE_ID_ROid =C.SALES_DELIVERY_D_ID
LEFT JOIN dbo.SALES_DELIVERY D ON C.SALES_DELIVERY_ID = D.SALES_DELIVERY_ID
LEFT JOIN dbo.ADMIN_UNIT F ON D.Owner_Dept = F.ADMIN_UNIT_ID
WHERE F.ADMIN_UNIT_NAME = '国际业务部' AND A.TRANSACTION_DATE BETWEEN '2018-11-1' AND '2018-11-30'
AND a.CreateDate BETWEEN '2018-11-1 16:00' AND '2018-11-30 16:00'
GROUP BY F.ADMIN_UNIT_NAME, A.DOC_DATE

TRANSACTION_DATE 是交易日期,没有时分秒
CreateDate 是创建单据的日期,有时分秒
...全文
438 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
钛元素 2018-12-10
  • 打赏
  • 举报
回复
Select CASE WHEN A.CreateDate BETWEEN CONVERT(DATETIME,CONVERT(NVARCHAR(10),DATEADD(DAY,-1,A.CreateDate),120)+' 16:00:00') AND CONVERT(DATETIME,CONVERT(NVARCHAR(10),A.CreateDate,120)+' 15:59:00') THEN CONVERT(NVARCHAR(10),A.CreateDate,120) ELSE CONVERT(NVARCHAR(10),DATEADD(DAY,1,A.CreateDate),120) END AS 时间, SUM(B.BUSINESS_QTY * C.PRICE) AS 金额 FROM dbo.SALES_ISSUE A LEFT JOIN dbo.SALES_ISSUE_D B ON B.SALES_ISSUE_ID = A.SALES_ISSUE_ID LEFT JOIN dbo.SALES_DELIVERY_D C ON B.SOURCE_ID_ROid =C.SALES_DELIVERY_D_ID LEFT JOIN dbo.SALES_DELIVERY D ON C.SALES_DELIVERY_ID = D.SALES_DELIVERY_ID LEFT JOIN dbo.ADMIN_UNIT F ON D.Owner_Dept = F.ADMIN_UNIT_ID WHERE F.ADMIN_UNIT_NAME = '国际业务部' AND A.TRANSACTION_DATE BETWEEN '2018-11-1' AND '2018-11-30' GROUP BY CASE WHEN A.CreateDate BETWEEN CONVERT(DATETIME,CONVERT(NVARCHAR(10),DATEADD(DAY,-1,A.CreateDate),120)+' 16:00:00') AND CONVERT(DATETIME,CONVERT(NVARCHAR(10),A.CreateDate,120)+' 15:59:00') THEN CONVERT(NVARCHAR(10),A.CreateDate,120) ELSE CONVERT(NVARCHAR(10),DATEADD(DAY,1,A.CreateDate),120) END
钛元素 2018-12-10
  • 打赏
  • 举报
回复
这样,结果跟最初的查询结果一样的...
钛元素 2018-12-10
  • 打赏
  • 举报
回复
照搬照抄,报错了 O_O
二月十六 版主 2018-12-10
  • 打赏
  • 举报
回复
引用 7 楼 钛元素 的回复:
是的!这个...看不太懂,是按分组?
就是按这个时间是属于哪个时间段的,如果是今天时间段的(昨天16点到今天16点),日期就是今天,如果不是今天段的,就是其他天。
钛元素 2018-12-10
  • 打赏
  • 举报
回复
是的!这个...看不太懂,是按分组?
二月十六 版主 2018-12-10
  • 打赏
  • 举报
回复
这个意思?
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([日期] DATETIME,[金额] int)
Insert #T
select N'2011-11-01 16:42:00',1 union all
select N'2011-11-02 15:42:00',1 union all
select N'2011-11-02 19:42:00',1
Go
--测试数据结束
Select CASE WHEN 日期 BETWEEN
CONVERT(DATETIME,CONVERT(NVARCHAR(10),DATEADD(DAY,-1,日期),120)+' 16:00:00') AND
CONVERT(DATETIME,CONVERT(NVARCHAR(10),日期,120)+' 15:59:00') THEN CONVERT(NVARCHAR(10),日期,120)
ELSE CONVERT(NVARCHAR(10),DATEADD(DAY,1,日期),120) END AS 日期,
SUM(金额) AS 金额
FROM #T
GROUP BY CASE WHEN 日期 BETWEEN
CONVERT(DATETIME,CONVERT(NVARCHAR(10),DATEADD(DAY,-1,日期),120)+' 16:00:00') AND
CONVERT(DATETIME,CONVERT(NVARCHAR(10),日期,120)+' 15:59:00') THEN CONVERT(NVARCHAR(10),日期,120)
ELSE CONVERT(NVARCHAR(10),DATEADD(DAY,1,日期),120) END


钛元素 2018-12-10
  • 打赏
  • 举报
回复
这是数据,然后根据这个数据统计每日的金额。 问题在于,要按照创建时间进行筛选,2018-11-02的总金额,是2018-11-01 16:00 - 2018-11-02 15:9 分的数据之和。
二月十六 版主 2018-12-10
  • 打赏
  • 举报
回复
引用 3 楼 钛元素 的回复:
这样只是最后一天的数据不同,感觉不对啊 我是不是应该写一个嵌套?先行筛选,然后统计?
没太看明白需求,楼主是不会取昨日16:00-今日15:59 这个范围值吗?还是什么问题?AND a.CreateDate BETWEEN and 这个条件没问题吧
钛元素 2018-12-10
  • 打赏
  • 举报
回复
这样只是最后一天的数据不同,感觉不对啊 我是不是应该写一个嵌套?先行筛选,然后统计?
钛元素 2018-12-10
  • 打赏
  • 举报
回复
引用 楼主 钛元素 的回复:
有一个需求,就是要求取每日的金额,我已经取出来了。但是要求取每日的金额有一个创建日期的范围是(昨日16:00-今日15:59)的金额,不知道怎么写了,help!
版主大大,这样的话,跟我写的sql统计出来的是一样的啊?
吉普赛的歌 版主 2018-12-10
  • 打赏
  • 举报
回复
--从出库单查询业务部门每日统计-国际业务部
SELECT F.ADMIN_UNIT_NAME              AS [部门],
       CONVERT(VARCHAR(20), A.DOC_DATE, 120) AS [日期],
       SUM(B.BUSINESS_QTY * C.PRICE)  AS [金额]
FROM   dbo.SALES_ISSUE A
       LEFT JOIN dbo.SALES_ISSUE_D B
            ON  B.SALES_ISSUE_ID = A.SALES_ISSUE_ID
       LEFT JOIN dbo.SALES_DELIVERY_D C
            ON  B.SOURCE_ID_ROid = C.SALES_DELIVERY_D_ID
       LEFT JOIN dbo.SALES_DELIVERY D
            ON  C.SALES_DELIVERY_ID = D.SALES_DELIVERY_ID
       LEFT JOIN dbo.ADMIN_UNIT F
            ON  D.Owner_Dept = F.ADMIN_UNIT_ID
WHERE  F.ADMIN_UNIT_NAME = '国际业务部'
       AND A.TRANSACTION_DATE BETWEEN '2018-11-1' AND '2018-11-30'
       AND a.CreateDate BETWEEN DATEADD(DAY,-1,'2018-11-1 16:00') AND '2018-11-30 16:00'
GROUP BY
       F.ADMIN_UNIT_NAME,
       A.DOC_DATE

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧