Sql查询从下午4:15:01到今天下午4:15:00选择数据

 愤然尔立_980 发布于 2023-02-12 16:06

我正在构建一个SSIS包,我需要从前一天下午4:15:01到今天下午4:15:00获取数据,但到目前为止,我知道的唯一查询是如何获得这一天之前.我不知道如何在同一个查询中添加小时,分钟和秒.有人可以告诉我如何在这个SQL查询中添加小时,分钟和秒吗?以下是我到目前为止的查询.

SELECT Posted_Date, Total_Payment FROM   
Table1
WHERE Posted_Date >= dateadd(day, datediff(day, 1, Getdate()), 0)
and Posted_date < dateadd(day, datediff(day, 0, getdate()), 0)
order by posted_date

Aaron Bertra.. 8

在这里要非常小心精确度 - 说昨天下午4:15:01你想要的东西,意味着在某些时候你可能会丢失数据(例如下午4:15:00.500).使用开放式范围要好得多,我通常喜欢在查询之外计算边界:

DECLARE @today DATETIME, @today_at_1615 DATETIME;

SELECT @today = DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0), 
       @today_at_1615 = DATEADD(MINUTE, 16.25*60, @today);

SELECT Posted_Date, Total_Payment
FROM dbo.Table1
WHERE Posted_Date > DATEADD(DAY, -1, @today_at_1615)
  AND Posted_Date <= @today_at_1615
ORDER BY Posted_date;

您还应该避免DATEDIFF在这样的查询中使用- 有一个基数估计错误,它可以真正影响查询的性能.我不相信这个bug会影响SQL Server 2005,但是如果你想要超级安全,你可以把它改成稍贵的:

SELECT @today = CONVERT(CHAR(8), GETDATE(), 112), 

在任何一种情况下,您都应该使用某种标记来标记此代码,这样当您进入SQL Server 2008或更高版本时,您可以更新它以使用更优化:

SELECT @today = CONVERT(DATE, GETDATE()), 
SSIS的事情

我创建了一个SSIS包,Execute SQL Task其中创建了我的表并用数据填充它,然后由a使用Data Flow Task

在此输入图像描述

执行SQL任务

我创建了一个执行SQL任务,连接到OLE DB连接管理器并使用以下直接输入.

-- This script sets up a table for consumption by the DFT
IF EXISTS
(
    SELECT * FROM sys.tables AS T WHERE T.name = 'Table1' AND T.schema_id = SCHEMA_ID('dbo')
)
BEGIN
    DROP TABLE dbo.Table1;
END;
CREATE table dbo.Table1
(
    Posted_Date datetime NOT NULL
,   Total_Payment int NOT NULL
);

INSERT INTO 
    dbo.Table1
(
    Posted_Date
,   Total_Payment
)
SELECT
    DATEADD(minute, D.rn, DATEADD(d, -1, CURRENT_TIMESTAMP)) AS Posted_Date
,   D.rn
FROM
(
    -- 2 days worth of data
    SELECT TOP (60*24*2)
        DI.rn
    FROM
        (
            SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn
            FROM sys.all_columns AS AC
        ) DI
) D;

右键单击Execute SQL Task并执行它.这可确保创建表,以便我们可以在下一步中使用它.

数据流任务

我创建了一个Data Flow Task并将该DelayValidation属性设置为True,因为我的连接管理器指向tempdb.在现实世界中可能不需要这样做.

我添加了一个OLE DB Source组件并将其配置为使用第一个查询

在此输入图像描述

然后我添加了一个派生列,允许我将数据查看器附加到流程并关闭该程序包.您可以观察到流过的最后一个值是否符合预期.

在此输入图像描述

1 个回答
  • 在这里要非常小心精确度 - 说昨天下午4:15:01你想要的东西,意味着在某些时候你可能会丢失数据(例如下午4:15:00.500).使用开放式范围要好得多,我通常喜欢在查询之外计算边界:

    DECLARE @today DATETIME, @today_at_1615 DATETIME;
    
    SELECT @today = DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0), 
           @today_at_1615 = DATEADD(MINUTE, 16.25*60, @today);
    
    SELECT Posted_Date, Total_Payment
    FROM dbo.Table1
    WHERE Posted_Date > DATEADD(DAY, -1, @today_at_1615)
      AND Posted_Date <= @today_at_1615
    ORDER BY Posted_date;
    

    您还应该避免DATEDIFF在这样的查询中使用- 有一个基数估计错误,它可以真正影响查询的性能.我不相信这个bug会影响SQL Server 2005,但是如果你想要超级安全,你可以把它改成稍贵的:

    SELECT @today = CONVERT(CHAR(8), GETDATE(), 112), 
    

    在任何一种情况下,您都应该使用某种标记来标记此代码,这样当您进入SQL Server 2008或更高版本时,您可以更新它以使用更优化:

    SELECT @today = CONVERT(DATE, GETDATE()), 
    

    SSIS的事情

    我创建了一个SSIS包,Execute SQL Task其中创建了我的表并用数据填充它,然后由a使用Data Flow Task

    在此输入图像描述

    执行SQL任务

    我创建了一个执行SQL任务,连接到OLE DB连接管理器并使用以下直接输入.

    -- This script sets up a table for consumption by the DFT
    IF EXISTS
    (
        SELECT * FROM sys.tables AS T WHERE T.name = 'Table1' AND T.schema_id = SCHEMA_ID('dbo')
    )
    BEGIN
        DROP TABLE dbo.Table1;
    END;
    CREATE table dbo.Table1
    (
        Posted_Date datetime NOT NULL
    ,   Total_Payment int NOT NULL
    );
    
    INSERT INTO 
        dbo.Table1
    (
        Posted_Date
    ,   Total_Payment
    )
    SELECT
        DATEADD(minute, D.rn, DATEADD(d, -1, CURRENT_TIMESTAMP)) AS Posted_Date
    ,   D.rn
    FROM
    (
        -- 2 days worth of data
        SELECT TOP (60*24*2)
            DI.rn
        FROM
            (
                SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn
                FROM sys.all_columns AS AC
            ) DI
    ) D;
    

    右键单击Execute SQL Task并执行它.这可确保创建表,以便我们可以在下一步中使用它.

    数据流任务

    我创建了一个Data Flow Task并将该DelayValidation属性设置为True,因为我的连接管理器指向tempdb.在现实世界中可能不需要这样做.

    我添加了一个OLE DB Source组件并将其配置为使用第一个查询

    在此输入图像描述

    然后我添加了一个派生列,允许我将数据查看器附加到流程并关闭该程序包.您可以观察到流过的最后一个值是否符合预期.

    在此输入图像描述

    2023-02-12 16:08 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有