根据结束日期将 sql 列映射到最新日期
map sql column to date based on an end date
我有一个支付期 sybase table 包含列名 day01 - day14。我还有一个包含支付期结束日期的列。管理层要求提供 7 月份所有星期一使用的时间。
如何遍历将列名映射到日期,以便使用 sybase 获取 7 月份的所有星期一?
数据示例
Time_Sheet_Hours
day01 | day02 | day03 ... day14 | end_date
7.5 | 7.5 | 0 ... | 2017-07-05
day01 | day02 | day03 ... day14 | end_date
7.5 | 7.5 | 7.5 ... | 2017-07-19
day01 | day02 | day03 ... day14 | end_date
7.5 | 7.5 | 7.5 ... | 2017-08-02
你能以某种方式做一个嵌套查询,其中 from 可以是基于列序列的动态并映射到基于 end_date 的日期吗?
什么时候应该做的一些粗暴的情况:
SELECT
CASE WHEN dayofweek(end_date - INTERVAL 13 day) = 2 THEN day01 END +
CASE WHEN dayofweek(end_date - INTERVAL 12 day) = 2 THEN day02 END +
... -- and so on. Writing this out on an iPad is a pain
CASE WHEN dayofweek(end_date - INTERVAL 1 day) = 2 THEN day13 END +
CASE WHEN dayofweek(end_date - INTERVAL 0 day) = 2 THEN day14 END
as sum_of_mondays
FROM time sheet
WHERE end_date BETWEEN x AND y
请用您的数据检查一下是否真实;检查调整后日期的 dayofweek() 计算是否确实正确识别星期一 - 我没有 MySQL 实例来尝试这个但文档说 dayofweekreturns 2 代表星期一,我假设 end_date 和 day14 是同一天,因此从中减去 0 天。如果您的 end_date 是在第 14 天的工作时间之后的午夜,那么您需要将减法调整一个(即 Subs 应该从减去 14 开始,并以减去 1 结束)
您可以在 mysql 中使用 datepart
in Sybase, or dayofweek
来确定 end_date 所在的星期几(星期日为 1)。然后您可以确定还有多少天 "day 2"(星期一 - 不是您的 "day02" 列)。然后使用 case 语句,或执行动态查询,以总结正确的日期。
这是 Sybase 中的示例。它假设 day14 也是 end_date.
因此,如果 end_date 是星期日,则意味着 day14 也是星期日,而 day01 和 day08 代表星期一。
select
sum
(
case
when (datepart(dw, end_date) = 1) then day01 + day08 -- Ends on Sun
when (datepart(dw, end_date) = 7) then day02 + day09 -- Ends on Sat
when (datepart(dw, end_date) = 6) then day03 + day10 -- Ends on Fri
when (datepart(dw, end_date) = 5) then day04 + day11 -- Ends on Thu
when (datepart(dw, end_date) = 4) then day05 + day12 -- Ends on Wed
when (datepart(dw, end_date) = 3) then day06 + day13 -- Ends on Tue
when (datepart(dw, end_date) = 2) then day07 + day14 -- Ends on Mon
else 0
end
)
from my_table
虽然这并没有具体回答我最初的问题,但我想分享我们的最终解决方案。最终的解决方案是只构建一个视图来查询包含规范化数据的视图。
我有一个支付期 sybase table 包含列名 day01 - day14。我还有一个包含支付期结束日期的列。管理层要求提供 7 月份所有星期一使用的时间。
如何遍历将列名映射到日期,以便使用 sybase 获取 7 月份的所有星期一?
数据示例
Time_Sheet_Hours
day01 | day02 | day03 ... day14 | end_date
7.5 | 7.5 | 0 ... | 2017-07-05
day01 | day02 | day03 ... day14 | end_date
7.5 | 7.5 | 7.5 ... | 2017-07-19
day01 | day02 | day03 ... day14 | end_date
7.5 | 7.5 | 7.5 ... | 2017-08-02
你能以某种方式做一个嵌套查询,其中 from 可以是基于列序列的动态并映射到基于 end_date 的日期吗?
什么时候应该做的一些粗暴的情况:
SELECT
CASE WHEN dayofweek(end_date - INTERVAL 13 day) = 2 THEN day01 END +
CASE WHEN dayofweek(end_date - INTERVAL 12 day) = 2 THEN day02 END +
... -- and so on. Writing this out on an iPad is a pain
CASE WHEN dayofweek(end_date - INTERVAL 1 day) = 2 THEN day13 END +
CASE WHEN dayofweek(end_date - INTERVAL 0 day) = 2 THEN day14 END
as sum_of_mondays
FROM time sheet
WHERE end_date BETWEEN x AND y
请用您的数据检查一下是否真实;检查调整后日期的 dayofweek() 计算是否确实正确识别星期一 - 我没有 MySQL 实例来尝试这个但文档说 dayofweekreturns 2 代表星期一,我假设 end_date 和 day14 是同一天,因此从中减去 0 天。如果您的 end_date 是在第 14 天的工作时间之后的午夜,那么您需要将减法调整一个(即 Subs 应该从减去 14 开始,并以减去 1 结束)
您可以在 mysql 中使用 datepart
in Sybase, or dayofweek
来确定 end_date 所在的星期几(星期日为 1)。然后您可以确定还有多少天 "day 2"(星期一 - 不是您的 "day02" 列)。然后使用 case 语句,或执行动态查询,以总结正确的日期。
这是 Sybase 中的示例。它假设 day14 也是 end_date.
因此,如果 end_date 是星期日,则意味着 day14 也是星期日,而 day01 和 day08 代表星期一。
select
sum
(
case
when (datepart(dw, end_date) = 1) then day01 + day08 -- Ends on Sun
when (datepart(dw, end_date) = 7) then day02 + day09 -- Ends on Sat
when (datepart(dw, end_date) = 6) then day03 + day10 -- Ends on Fri
when (datepart(dw, end_date) = 5) then day04 + day11 -- Ends on Thu
when (datepart(dw, end_date) = 4) then day05 + day12 -- Ends on Wed
when (datepart(dw, end_date) = 3) then day06 + day13 -- Ends on Tue
when (datepart(dw, end_date) = 2) then day07 + day14 -- Ends on Mon
else 0
end
)
from my_table
虽然这并没有具体回答我最初的问题,但我想分享我们的最终解决方案。最终的解决方案是只构建一个视图来查询包含规范化数据的视图。