sql - SQL Server中按期间的日期差异分组
问题描述
这是数据库表结构
卡号 | 帐号 | 活动日期 | 最后充电日期 | 到期日 |
---|---|---|---|---|
XXX1702 | 154505100 | 01-05-2013 | 02-06-2020 | 28-02-2021 |
XXX2148 | 41805 | 01-05-2013 | 02-06-2020 | 28-02-2021 |
XXX2694 | 4844404 | 01-05-2013 | 02-06-2020 | 28-02-2021 |
XXX6634 | 44804844888 | 01-05-2013 | 02-06-2020 | 28-02-2021 |
XXX7160 | 80445540 | 01-05-2013 | 02-06-2020 | 28-02-2021 |
这是我的 SQL 查询
SELECT c.accno,
5.00
AS Charge,
Concat('CARD XX', RIGHT(c.cardno, 4), ' AMC ', Upper(
Format(c.lastchargedate, 'MMM')),
Format(c.lastchargedate, 'yy'), ' ', 'to ',
Upper(Format(Getdate(), 'MMM')), Format(CONVERT(DATE, Getdate()), 'yy'))
AS
Period,
c.lastchargedate,
c.activedate
FROM cc c
WHERE c.lastchargedate IS NOT NULL
AND Datediff(day, c.lastchargedate, CONVERT(DATE, Getdate())) >= 365
结果如下。
PrimaryAccount Charge Period LastChargeDate ActiveDate
104011192124 180.00 CARD XX9912 AMC MAR20 to MAR21 2020-03-03 2018-02-21
104011206784 180.00 CARD XX7122 AMC MAR20 to MAR21 2020-03-03 2019-02-04
104011266381 180.00 CARD XX8064 AMC MAR20 to MAR21 2020-03-03 2017-02-09
104011150218 180.00 CARD XX8775 AMC MAR20 to MAR21 2020-03-03 2017-02-17
104011262467 180.00 CARD XX0510 AMC APR18 to MAR21 2018-04-09 2018-03-21
最后记录显示 4 月 18 日至 3 月 21 日,费用仅为 5
总天数:1076 天因此,费用应为 2 倍 1076/365=2.94 施法后(2.946 AS INT)
如果天数超过 365 天,即如果期间是 4 月 18 日至 3 月 21 日,然后是 4 月 18 日至 3 月 20 日和 4 月 20 日至 3 月 21 日等,如何收取两次费用
IE
104011262467 180.00 CARD XX0510 AMC APR18 to MAR21 2018-04-09 2018-03-21
应该像下面的结果
104011262467 180.00 CARD XX0510 AMC APR18 to MAR19 2018-04-09 2018-03-21
104011262467 180.00 CARD XX0510 AMC APR19 to MAR20 2018-04-09 2018-03-21
104011262467 180.00 CARD XX0510 AMC APR20 to MAR21 2018-04-09 2018-03-21
解决方案
您可以将费用乘以年数,这适用于所有情况
SELECT c.accno,
5.00 * FLOOR(Datediff(day, c.lastchargedate, CONVERT(DATE, Getdate()))/365)
AS Charge,
Concat('CARD XX', RIGHT(c.cardno, 4), ' AMC ', Upper(
Format(c.lastchargedate, 'MMM')),
Format(c.lastchargedate, 'yy'), ' ', 'to ',
Upper(Format(Getdate(), 'MMM')), Format(CONVERT(DATE, Getdate()), 'yy'))
AS
Period,
c.lastchargedate,
c.activedate
FROM cc c
WHERE c.lastchargedate IS NOT NULL
推荐阅读
- laravel - Laravel - :“in_array()期望参数2是数组,对象给定”在离开请求中
- java - 为什么我不能从 PriorityQueue 中删除 peek() 获取的元素?
- javascript - Wheelnav.js,默认 NavItemText 未选择
- c# - Azure 功能无法访问连接的 WCF 服务
- c++ - 如何编写 gmock 测试,使其不调用夹具类的构造函数
- python - 如何使用python cgi?
- asp.net-core - 写入响应正文时为空标题和响应正文
- nuxt.js - 如何在 NuxtJS 项目中使用 EditorJS?
- asp.net - 目标 Web 配置文件中的 XDT 转换
- c++ - onPushButtonClick 代码重定向到另一个 Widget/Class(mainWindow.cpp)