sql-server - 获取ID日期和正负天数之间的日期

标签 sql-server t-sql sql-server-2008-r2

我有以下示例数据:

CREATE TABLE tblDates
(
    ID int,
    Dates DATE
);

SELECT * FROM tblDates

INSERT INTO tblDates VALUES(1,'2019-12-01');
INSERT INTO tblDates VALUES(2,'2019-12-05');
INSERT INTO tblDates VALUES(3,'2019-12-02');
INSERT INTO tblDates VALUES(4,'2019-12-09');
INSERT INTO tblDates VALUES(5,'2019-12-11');

在这里,我正在查找 ID = 4date 和正负 1,2,....n 天之间的日期。

尝试 1:我尝试使用 UNION ALL。

SELECT Dates FROM tblDates WHERE ID = 4 
UNION ALL
SELECT DATEADD(day,1,Dates) FROM tblDates WHERE ID = 4;

当我寻找 50 或更多天数差异时,此方法并不适用。

尝试 2:

SELECT Dates FROM tblDates WHERE ID = 4 AND Dates between Dates AND DATEADD(day,1,Dates);

有单例约会。

尝试 3:

创建函数:获取日期的函数

CREATE FUNCTION udf_GetDates(@MinDate DATE,@MaxDate DATE)
RETURNS TABLE
AS
RETURN
SELECT  TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1)
        Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate)
FROM    sys.all_objects a
        CROSS JOIN sys.all_objects b;

查询:

SELECT f.* 
FROM udf_GetDates(t.Dates,DATEADD(day,1,t.Dates)) f        
INNER JOIN tblDates t ON f.[Date] = t.[Dates]
WHERE t.ID = 4

出现错误:

Msg 4104, Level 16, State 1, Line 2 The multi-part identifier "t.Dates" could not be bound. Msg 4104, Level 16, State 1, Line 2 The multi-part identifier "t.Dates" could not be bound.

预期输出:

给定:ID = 4 且 day=+1

Dates
----------- 
2019-12-09
2019-12-10

给定:ID = 4 且 day=+10

Dates
----------- 
2019-12-09
2019-12-10
2019-12-11
2019-12-12
2019-12-13
2019-12-14
2019-12-15
2019-12-16
2019-12-17
2019-12-18

给定:ID = 4 和 day=-5

Dates
----------  
2019-12-05
2019-12-06
2019-12-07
2019-12-08
2019-12-09

最佳答案

尝试这个查询

FIDDLE DEMO

函数

CREATE FUNCTION udf_GetDates (@StartDate DATE, @Range INT)
RETURNS TABLE
AS
RETURN
    SELECT  
        DATEADD(DAY, nbr - 1, @StartDate) myDate
    FROM    
        (SELECT    
             ROW_NUMBER() OVER (ORDER BY c.object_id) AS Nbr
         FROM      
             sys.columns c) nbrs
    WHERE   
        nbr - 1 <= @Range

查询用法#1:

SELECT f.myDate 
FROM udf_GetDates((SELECT dates FROM tblDates WHERE ID = 4), 2) f      

查询用法#2:

SELECT t.*, P.*
FROM tblDates t 
OUTER APPLY udf_GetDates(t.Dates, 5) p
WHERE t.ID = 4

更新的答案:

下一个日期

CREATE FUNCTION udf_GetDates (@StartDate DATE, @Range INT)
RETURNS TABLE
AS
RETURN
    SELECT  
        DATEADD(DAY, nbr - 1, @StartDate) myDate
    FROM    
        (SELECT    
             ROW_NUMBER() OVER (ORDER BY c.object_id) AS Nbr
         FROM      
             sys.columns c) nbrs
    WHERE   
        nbr - 1 <= @Range

之前的日期

CREATE FUNCTION [udf_GetDates_Minuus] (@StartDate DATE, @Range INT)
RETURNS TABLE
AS
RETURN
    SELECT  
        DATEADD(DAY, -(nbr - 1), @StartDate) myDate
    FROM    
        (SELECT    
             ROW_NUMBER() OVER (ORDER BY c.object_id) AS Nbr
         FROM      
             sys.columns c) nbrs
    WHERE   
        nbr - 1 <= @Range

单个函数中的下一个和上一个日期

CREATE FUNCTION udf_GetDatesNextandPrevious(@StartDate DATE, @Range INT)
RETURNS TABLE
AS
RETURN
    SELECT  
        DATEADD(DAY, nbr - 1, @StartDate) myDate
    FROM    
        (SELECT    
             ROW_NUMBER() OVER (ORDER BY c.object_id) AS Nbr
         FROM      
             sys.columns c) nbrs
    WHERE   
        nbr - 1 <= @Range

    UNION

    SELECT  
        DATEADD(DAY, -(nbr - 1), @StartDate) myDate
    FROM    
        (SELECT    
             ROW_NUMBER() OVER (ORDER BY c.object_id) AS Nbr
         FROM      
             sys.columns c) nbrs
    WHERE   
        nbr - 1 <= @Range

<强> Updated Fiddle

关于sql-server - 获取ID日期和正负天数之间的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59317759/

相关文章:

sql-server - T SQL - 从分组结果中获取附加数据

LINQ:日期时间字段中按月和年分组

sql-server-2008-r2 - 读取 BCP 格式文件时出现 I/O 错误

sql-server - 如何插入默认值作为 SQL Server View 定义的一部分?

c# - 我应该如何从 Entity Framework 4.1 中的存储过程返回一个 int?

mysql - 用于故障转移的 DBMS

sql - 获取 2 个不同字符串之间的字符串的一部分

sql - 关于函数 COUNT ('' ) 及其种类的问题

sql - 将列名称移至行

t-sql - 如果单词之间有空格,则在 SSRS 中拆分字符串