Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql查询选择前一天下午4:15:01到今天下午4:15:00的数据_Sql_Sql Server_Sql Server 2005_Ssis - Fatal编程技术网

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

Sql查询选择前一天下午4:15:01到今天下午4:15:00的数据,sql,sql-server,sql-server-2005,ssis,Sql,Sql Server,Sql Server 2005,Ssis,我正在构建一个SSIS包,在其中我需要获取前一天下午4:15:01到今天下午4:15:00的数据,但到目前为止,我知道的唯一查询是如何获取前一天的数据。我不知道如何在同一个查询中添加小时、分钟和秒。有人能告诉我如何将小时、分钟和秒添加到此sql查询中吗? 以下是我到目前为止提出的问题 SELECT Posted_Date, Total_Payment FROM Table1 WHERE Posted_Date >= dateadd(day, datediff(day, 1, Getd

我正在构建一个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
选择过账日期、付款总额
表1
其中发布日期>=dateadd(day,datediff(day,1,Getdate()),0)
和发布日期
在这里要非常小心精度-如果说你想从昨天下午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;
在任何一种情况下,您都应该使用某种标志来标记此代码,这样当您进入SQL Server 2008或更高版本时,您就可以对其进行更新,以使用更优化的:

SELECT @today = CONVERT(DATE, GETDATE()), 
SSIS的东西 我创建了一个SSIS包,其中包含一个
executeSQL任务
,该任务创建了我的表,并用数据填充该表,然后由
数据流任务

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

-- 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;
右键单击执行SQL任务并执行它。这样可以确保创建表,以便我们在下一步中使用它

数据流任务 我创建了一个
数据流任务
,并将
DelayValidation
属性设置为True,因为我的连接管理器指向tempdb。这在现实世界中可能不需要

我添加了一个OLEDB源组件,并将其配置为使用第一个查询

然后,我添加了一个派生列,以允许我将data viewer附加到流并启动包。您可以观察到,流式传输的最后一个值与预期值相同


我认为这也会起到类似的作用

DECLARE @today DATETIME, @today_at_1615 DATETIME;
SELECT @today = CONVERT(DATE, GETDATE()), 
    @today_at_1615 = DATEADD(MINUTE, 16.25*60, @today);

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

可能会对使用BETWEEN发表评论,但我没有相关的销售代表。不使用between子句有什么原因吗?

问同样问题的另一种方式:向我展示如果在7小时、44分钟和59秒后发布的数据,今天就会发布的数据

SELECT Posted_Date, Total_Payment FROM   
Table1
WHERE CAST(DATEADD(second,7*60*60+44*60+59,Posted_Date) AS date) = CAST(GETDATE() as date)

这将顺利处理fencepost问题、分数秒和夏令时,并且在
CAST(DATEADD(秒,7*60*60+44*60+59,Posted_Date)作为日期)上使用索引将非常快速。

我尝试了您的查询,这是我在SSIS中遇到的错误,如何修复此错误?数据流任务[OLE DB Source[11]]处出错:SSIS错误代码DTS_E_OLEDBERROR。发生OLE DB错误。错误代码:0x80040E14。本机客户端11.0“Hresult:0x80040E14说明:”必须声明标量变量“@today_at_1615”。。OLE DB记录可用。来源:“Microsoft SQL Server本机客户端11.0”Hresult:0x80040E14说明:“无法为局部变量指定默认值。“@Lily您使用的是什么版本?Visual Studio 2010、framework 4和Microsoft Sql server 2008 r2I很抱歉,这是我们众多服务器中的一个。此特定服务器是Microsoft server 2005 r2,而不是2008,只是2005。关于SQL Server,R2命名愚蠢仅对SQL Server 2008有效。还有,有很多理由不在两者之间使用。首先,在接下来的几天中,您将从下午4:15开始重复计算数据。我假设你只想计算一天的数据(问题的措辞听起来像今天)。请阅读:即使两者之间有效(假设我的查询是您复制的used>=并且除了您在日志中提到的内容之外,从长远来看,您的代码将能够更好地处理对数据库的更改。问题是它是不可搜索的,在
Posted\u Date
列上创建一个索引几乎或完全无用。添加一个索引,它甚至不包含任何内容。)他在一个非持久化的计算列上查询,以支持where子句中不必要的非可搜索表达式?对不起,这会使这个建议变得更糟,而不是更好。如果您的业务逻辑定义的时间段的开始与标准日历不同,那么有时最好根据该时间段对数据进行索引和分区,而不是f或将其转换为另一个。如果一个工作日在下午4:15开始和结束,为什么不处理它?更改表1添加PostedBusinessDate作为演员(DATEADD(第二个,7*60*60+44*60+59,Posted_Date)作为日期);在表1上创建索引IX_PostedBusinessDate(PostedBusinessDate)包括(总付款)我说不出话来……出于上面列出的所有原因,这可能是我在相当长一段时间内看到的最糟糕的建议之一。我强烈建议你删除这个答案,以免有人把它误认为是建议。
SELECT Posted_Date, Total_Payment FROM   
Table1
WHERE CAST(DATEADD(second,7*60*60+44*60+59,Posted_Date) AS date) = CAST(GETDATE() as date)