【问题标题】:SQL Select Sequential Dates with Additional Lookup ValuesSQL 选择具有附加查找值的连续日期
【发布时间】:2017-04-12 07:46:47
【问题描述】:

我正在尝试获取我的数据库中存在的一系列日期和相应的值(如果有)。

我有两个参数 - 今天(使用 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 中不存在“小时”值,我需要返回默认值 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 和一个临时表来完成此操作,但我想看看这是否可以在单个语句中完成。任何帮助表示赞赏。

【问题讨论】:

  • 你是说你想得到一个未来十天的列表,然后,不管他们是否有记录,选择那些日期+那些日期可能存在的任何记录?还是只需要未来十天内的任何日期(如果存在)?
  • 是的,完全正确。如果没有记录,则返回默认的 8 小时。

标签: sql-server tsql


【解决方案1】:

没有任何 DDL 或示例数据,很难准确确定您需要什么。

我认为这会让你非常接近(注意我的 cmets):

-- 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

【讨论】:

    【解决方案2】:

    可能是子查询和 in 语句,例如:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 2019-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多