2017-04-11 31 views
0

我想抓住一系列日期和我的數據庫中存在的相應值(如果有的話)。SQL選擇具有附加查找值的順序日期

我有兩個參數 - 今天(日期使用getDate())和天數(整數)。對於這個例子,我使用數值爲10的日子。

代碼來獲得10天的連續日期後的今天:

SELECT top 10 DATEADD(DAY, ROW_NUMBER() 
OVER (ORDER BY object_id), REPLACE(getDate(),'-','')) as Alldays 
FROM sys.all_objects 

我現在需要看幾個值每一天在連續幾天的代碼,這可能會或可能不會在時間表中存在(除非另有說明,我們假設所有日期爲8小時)。查詢將在字段recordDateTime上。如果該日期的表cap_time中不存在「hours」值,則需要返回默認值8作爲小時數。這裏的基本查詢:

   SELECT u.FullName as UserName, d2.department, 
       recordDateTime, ISNULL(hours,8) as hours 
       FROM cap_time c 
       left join user u on c.userID = u.userid 
       left join dept d2 on u.deptID = d2.DeptID 
       WHERE c.userid = 38 AND u.deptID = 1 

我對未來10天應該是這樣的最終結果是: 日期(順序),部門,用戶名,時間

數,我可以做到這一點使用TSQL和臨時表,但我想看看這是否可以在一個聲明中完成。任何幫助表示讚賞。

+0

你是說你想獲得接下來十天的清單,然後,無論他們是否有記錄,選擇這些日期+任何記錄這些日期可能存在嗎?或者您是否只需要在未來十天內使用任何日期(如果存在)? – ZLK

+0

是的,確切地說。如果沒有記錄,則返回默認的8小時。 – KMBonin

回答

0

沒有任何DDL或樣本數據,很難確切地確定您需要什麼。

我認爲這將讓你很接近(注意我的意見):

-- sample data 
------------------------------------------------------------------------------------------ 
DECLARE @table TABLE 
(
    fullName varchar(10), 
    department varchar(10), 
    [hours] tinyint, 
    somedate date 
); 

INSERT @table VALUES 
('bob', 'sales', 5, getdate()+1), 
('Sue', 'marketing', 3, getdate()+2), 
('Sue', 'sales', 12, getdate()+4), 
('Craig', 'sales', 4, getdate()+8), 
('Joe', 'sales', 18, getdate()+9), 
('Fred', 'sales', 10, getdate()+10); 

--SELECT * FROM @table 
; 

-- solution 
------------------------------------------------------------------------------------------ 
WITH alldays([day]) AS -- logic to get your dates for a LEFT date table 
(
    SELECT TOP (10) 
    CAST(DATEADD 
    (
     DAY, 
     ROW_NUMBER() OVER (ORDER BY object_id), 
     getdate() 
    ) AS date) 
    FROM sys.all_objects 
) 
SELECT d.[day], t.fullName, department, [hours] = ISNULL([hours], 8) 
FROM alldays d 
LEFT JOIN @table t ON d.[day] = t.somedate; 

結果:

day  fullName department hours 
---------- ---------- ---------- ----- 
2017-04-12 bob  sales  5 
2017-04-13 Sue  marketing 3 
2017-04-14 NULL  NULL  8 
2017-04-15 Sue  sales  12 
2017-04-16 NULL  NULL  8 
2017-04-17 NULL  NULL  8 
2017-04-18 NULL  NULL  8 
2017-04-19 Craig  sales  4 
2017-04-20 Joe  sales  18 
2017-04-21 Fred  sales  10 
0

也許一個子查詢和報表,如:

SELECT u.FullName as UserName, d2.department, 
      recordDateTime, ISNULL(hours,8) as hours 
      FROM cap_time c 
      left join user u on c.userID = u.userid 
      left join dept d2 on u.deptID = d2.DeptID 
      WHERE c.userid = 38 AND u.deptID = 1 and recordDateTime in 
       (SELECT top 10 DATEADD(DAY, ROW_NUMBER() 
        OVER (ORDER BY object_id), REPLACE(getDate(),'-','')) as Alldays 
        FROM sys.all_objects)