2017-08-11 50 views
-3

我有一个包含列名称day01 - day14的支付期间sybase表。我也有一个包含薪酬期结束日期的列。管理层要求在七月份的所有星期一使用小时。根据结束日期映射sql列到日期

如何将列名映射到日期以便我可以在7月份使用sybase获取所有星期一?

数据例如

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 

你可以以某种方式做一个嵌套查询,其中可从基于列的序列,并映射到基于该END_DATE日期是动态的?

+1

Sybase或MySQL?或者这个问题与两者有关? – RiggsFolly

+0

多么奇怪的存储数据的方式。但是,由于14天是两周,所以您必须知道哪些列总是星期一。如果你的星期从星期天开始,那么所有第2天和第09天的星期一是星期一。您可以先创建一个临时表,为每个day02/end_date组合和每个day09/end_date组合分配一个日期。 – Degan

+0

Sybase是主数据库,但我们测试数据库是在mysql中。是的,这是存储数据的一种非常奇怪的方式。如果两个数据库中的任何一个都有专家帮助我们走上正确的道路,那么我们可以找出其他数据库。我们只知道sybase支持相当薄弱。 –

回答

1

您可以使用datepart Sybase或dayofweek,以确定end_date所在的星期几(星期日为1)。然后,您可以确定“第2天”(星期一 - 而不是“第2天”栏)之前还有多少天。然后使用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 
+0

这是一个很好的一点,不需要做2周的价格计算.. –

+0

@Robbie丰田这个查询有能力保持在一个月内。例如,如果薪酬期限在第三天结束,我们需要在星期三完成所有工作时间,那么它能否在第一天之前提取日期? –

+1

@CodeJunkie这个特定的查询将无法做到,但它可以修改为。你可以用'DATEPART(DD日期,结束日期)'找到该月的一天,day14落在(假设它是一样END_DATE)。然后在案件陈述中包括一天的支票。您还需要将诸如“day01 + day08”之类的内容分解为单独的“when”语句。例如:当'(日期部分(DW日期,结束日期)= 1和日期分量(DD日期,结束日期)> = 14),那么day01'并重复第八天:'时(日期部分(DW日期,结束日期)= 1和日期分量(DD日期,结束日期)> = 7)然后是第08天。 – RToyo

1

位野蛮情况的时候应该这样做:

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()calc是否确实能够正确识别星期一 - 我没有MySQL实例可以尝试此操作,但文档说dayofweek在星期一返回2,并且我认为end_date和day14是因此在同一天从它进行0天的破坏。如果您的end_date是工作日14小时后的午夜,则需要将相减调整一次(Ie Subs应该以减去14开始,然后减去1结束)

+1

根据罗比toyotas解决方案,实际上并不需要像我在我的模式中那样列出完整的2周;它可以通过进行7天的计算并加入例如Day01和Day07之后 –

+0

我会在星期一尝试你的建议。谢谢您的帮助。 –

0

虽然这并没有具体回答我的原始问题,但我想分享我们的最终解决方案。最终的解决方案是构建一个视图来查询包含规范化数据的视图。

相关问题