2017-08-11 83 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

雖然這並沒有具體回答我的原始問題,但我想分享我們的最終解決方案。最終的解決方案是構建一個視圖來查詢包含規範化數據的視圖。

相關問題