在 SQL Server 中查找最近的日期

     2023-02-25     8

关键词:

【中文标题】在 SQL Server 中查找最近的日期【英文标题】:Find closest date in SQL Server 【发布时间】:2012-12-10 23:34:07 【问题描述】:

我有一张表 dbo.XDateTime column Y 可能有数百条记录。

我的存储过程有参数@CurrentDate,我想找出上表dbo.Xcolumn Y中小于和最接近@CurrentDate.的日期

如何找到它?

【问题讨论】:

【参考方案1】:

where 子句将匹配日期小于@CurrentDate 的所有行,并且由于它们是按后代排序的,因此 TOP 1 将是与当前日期最接近的日期。

SELECT TOP 1 *
FROM x
WHERE x.date < @CurrentDate
ORDER BY x.date DESC

【讨论】:

取决于数据库设计。我建议您尝试在表上为日期字段设置索引,以便系统能够直接查找与查询匹配的值。 我想问一个后续问题:您如何找到每个客户的最近日期? This article 建议使用窗口函数。你同意吗? @kmote 如果您只需要客户 ID 和相应的日期,那么为简单起见,我会选择 'SELECT x.CustomerID, MAX(x.date) FROM x GROUP BY x.CustomerID' 替代方案在您链接的文章中提出。但是,如果您想检索更多信息和/或执行更多计算而不是获取最新日期,那么窗口函数似乎是一个不错的选择。我没有太多经验可以告诉你这个函数在性能方面的表现如何,但我肯定会尝试。【参考方案2】:

使用DateDiff 并按该日期与输入内容之间的天数或秒数对结果排序

类似的东西

    select top 1 rowId, dateCol, datediff(second, @CurrentDate, dateCol) as SecondsBetweenDates
    from myTable
    where dateCol < @currentDate
    order by datediff(second, @CurrentDate, dateCol)

【讨论】:

在 ORDER BY 中,您可以通过别名引用列(即您可以ORDER BY SecondsBetweenDate)。但是,您是按表达式而不是按列对行进行排序。这很可能使查询成为非sargable。只是一个注释。 你可能会在 datediff 中得到负数,然后最接近你想要的结果的地方就是中间的某个地方。 如果您不知道您的第一个日期是否小于或大于第二个日期,则可能需要使用 diff 的绝对值 ABS 来处理负值。【参考方案3】:

我认为对于这个问题我有更好的解决方案。

我将展示一些图片来支持和解释最终解决方案。

背景 在我的解决方案中,我有一张外汇汇率表。这些代表不同货币的市场汇率。但是,我们的服务提供商在费率馈送方面存在问题,因此某些费率的值为零。我想用最接近缺失汇率的同一货币的汇率填充缺失的数据。基本上我想获得最接近的非零利率的 RateId,然后我将替换它。 (这在我的示例中没有显示。)

1) 首先让我们找出缺失的费率信息:

Query showing my missing rates i.e. have a rate value of zero

2) 接下来让我们确定没有遗漏的费率。 Query showing rates that are not missing

3) 这个查询是魔法发生的地方。我在这里做了一个假设,可以删除但添加以提高查询的效率/性能。第 26 行的假设是,我希望在丢失/零交易的同一天找到替代交易。 神奇的是第 23 行:Row_Number 函数添加了一个从 1 开始的自动编号,用于丢失和未丢失事务之间的最短时间差。下一个最接近的事务的 rownum 为 2 等。

请注意,我必须在第 25 行加入货币,以免货币类型不匹配。那就是我不想用瑞士法郎值代替澳元货币。我想要最匹配的货币。

Combining the two data sets with a row_number to identify nearest transaction

4) 最后,让我们获取 RowNum 为 1 的数据 The final query

查询全查询如下;

    ; with cte_zero_rates as
(
        Select      * 
        from        fxrates
        where       (spot_exp = 0 or spot_exp = 0) 
),
cte_non_zero_rates as
(
        Select      * 
        from        fxrates
        where       (spot_exp > 0 and spot_exp > 0) 
)
,cte_Nearest_Transaction as
(
        select       z.FXRatesID    as Zero_FXRatesID
                    ,z.importDate   as Zero_importDate
                    ,z.currency     as Zero_Currency
                    ,nz.currency    as NonZero_Currency
                    ,nz.FXRatesID   as NonZero_FXRatesID
                    ,nz.spot_imp
                    ,nz.importDate  as NonZero_importDate
                    ,DATEDIFF(ss, z.importDate, nz.importDate) as TimeDifferece
                    ,ROW_NUMBER() Over(partition by z.FXRatesID order by abs(DATEDIFF(ss, z.importDate, nz.importDate)) asc) as RowNum
        from        cte_zero_rates z 
        left join   cte_non_zero_rates nz on nz.currency = z.currency
                    and cast(nz.importDate as date) = cast(z.importDate as date)
        --order by  z.currency desc, z.importDate desc
)
select           n.Zero_FXRatesID
                ,n.Zero_Currency
                ,n.Zero_importDate
                ,n.NonZero_importDate
                ,DATEDIFF(s, n.NonZero_importDate,n.Zero_importDate) as Delay_In_Seconds
                ,n.NonZero_Currency
                ,n.NonZero_FXRatesID
 from           cte_Nearest_Transaction n
 where          n.RowNum = 1
                and n.NonZero_FXRatesID is not null
 order by       n.Zero_Currency, n.NonZero_importDate

【讨论】:

【参考方案4】:
CREATE PROCEDURE CurrentDate
@CurrentDate DATETIME
AS
BEGIN
    Select * from orders
    where OrderDate < @CurrentDate
END
GO

【讨论】:

虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。 我听到了,但是这个网站的规则并不喜欢讨论。我希望有人能下定决心。

需要在 SQL Server 2008 中查找两个日期之间的日期

】需要在SQLServer2008中查找两个日期之间的日期【英文标题】:Needtofinddate\'sbetween2date\'sinSQLServer2008【发布时间】:2010-03-1415:26:21【问题描述】:我需要查询帮助以查找2009年12月12日至2010年2月31日之间的所有日期在SQLServer2008中我... 查看详情

在 SQL Server 中查找非连续日期

】在SQLServer中查找非连续日期【英文标题】:FindNonConsecutivedateinSQLServer【发布时间】:2016-10-2610:34:46【问题描述】:我想找到两个连续日期之间的missingNON-consecutivedates。我正在发布我的SQL查询和临时表以找出结果。但我没有得到... 查看详情

Sql Server 查找下一个最近更改的记录

】SqlServer查找下一个最近更改的记录【英文标题】:SqlServerFindNextMostRecentChangedRecord【发布时间】:2011-01-2720:24:50【问题描述】:在我的员工历史记录表中,我试图找出薪水是多少,然后又变成了什么。每次薪水更改都会插入一... 查看详情

如何在 SQL Server 的多行中查找连续的日期

】如何在SQLServer的多行中查找连续的日期【英文标题】:HowtofindcontiguousdatesinnumerousrowsinSQLServer【发布时间】:2016-07-2901:53:14【问题描述】:我们有一张为人们提供服务的桌子。例如:idpeople_iddateStartdateEnd1128.07.1419.07.162214.04.1516.0... 查看详情

在 SQL Server 中查找多边形内/最近的纬度/经度

】在SQLServer中查找多边形内/最近的纬度/经度【英文标题】:Findinglat/longswithin/nearesttopolygoninSQLServer【发布时间】:2014-02-1120:50:56【问题描述】:我是使用SQLServer2012的初学者。我想确定一个数据库中表A中的一组纬度/经度是否落... 查看详情

查找在 SQL Server 2014 中拥有多个帐户的客户的真正开始结束日期

】查找在SQLServer2014中拥有多个帐户的客户的真正开始结束日期【英文标题】:FindthetruestartenddatesforcustomersthathavemultipleaccountsinSQLServer2014【发布时间】:2020-01-2720:27:29【问题描述】:我有一个支票账户表,其中包含Cust_id(客户ID... 查看详情

SQL Server:查找学生在自定义日期内的连续缺勤计数

】SQLServer:查找学生在自定义日期内的连续缺勤计数【英文标题】:SQLServer:findingconsecutiveabsencecountsforstudentsovercustomdates【发布时间】:2017-02-2513:59:04【问题描述】:我有一张表格,用于存储学生每天的出勤情况。我需要让连续... 查看详情

SQL 中高效的“查找最近的数字或日期”,其中日期/数字列被索引覆盖

】SQL中高效的“查找最近的数字或日期”,其中日期/数字列被索引覆盖【英文标题】:efficient"findnearestnumberordate"inSQLwheredate/numbercolumniscoveredbyanindex【发布时间】:2011-07-1900:30:42【问题描述】:使用SQL2008,我试图找出一... 查看详情

在 SQL Server 中出现“超出范围值”错误后如何查找错误日期?

】在SQLServer中出现“超出范围值”错误后如何查找错误日期?【英文标题】:Howtofindthewrongdatesafteran\'out-of-rangevalue\'errorinSQLServer?【发布时间】:2022-01-2202:52:23【问题描述】:我想将格式为mm/dd/yyyy的列转换为日期时间,但是当我... 查看详情

如何从 sql server 2008 中具有不同 TaskIds 的表中查找日期?

】如何从sqlserver2008中具有不同TaskIds的表中查找日期?【英文标题】:HowtofinddatesfromatablewithdistinctTaskIdsinsqlserver2008?【发布时间】:2015-01-2209:50:52【问题描述】:我正在处理一个应用程序,其中有一个需要一年详细信息的任务表... 查看详情

尝试查找 Oracle SQL 中状态字段更改的最近日期

】尝试查找OracleSQL中状态字段更改的最近日期【英文标题】:TryingtofindthemostrecentdatewhereastatusfieldhaschangedinOracleSQL【发布时间】:2019-08-0821:48:32【问题描述】:我有一个表格,其中显示了位置ID(LOCN_ID)的完整历史记录,其中包括一... 查看详情

如何在 SQL Server 中获取 0 值的缺失日期?

】如何在SQLServer中获取0值的缺失日期?【英文标题】:Howtogetmissingdateswith0valueinSQLServer?【发布时间】:2019-07-1611:17:56【问题描述】:我在SQLServer中使用以下查询来查找distinct过去7天(不包括今天的日期)的登录次数:SELECTTOP(7)CO... 查看详情

Access SQL 查询:查找表中每个不同条目的日期最近的行

】AccessSQL查询:查找表中每个不同条目的日期最近的行【英文标题】:AccessSQLquery:findtherowwiththemostrecentdateforeachdistinctentryinatable【发布时间】:2009-11-0922:10:34【问题描述】:全部,我确信这是一个非常简单的SQL查询问题,但我确... 查看详情

按日期查找记录sql Server

】按日期查找记录sqlServer【英文标题】:findarecordbydatesqlServer【发布时间】:2013-03-0313:01:06【问题描述】:我有一个表产品(prodID,stock,createdDatetypeDATETIME)想从表中查找当前日期的所有记录谢谢【问题讨论】:听起来您想在SELECT... 查看详情

如何在 SQL Server 中查找上次修改表的人?

】如何在SQLServer中查找上次修改表的人?【英文标题】:HowtofindwholastmodifiedthetableinSQLserver?【发布时间】:2015-04-2321:19:33【问题描述】:我正在尝试查找上次修改SQLServer中特定表的用户。sys.dm_db_index_usage_stats提供有关表的最后修... 查看详情

在用户日表中查找最近的购买日期

】在用户日表中查找最近的购买日期【英文标题】:Findmostrecentdateofpurchaseinuserdaytable【发布时间】:2018-09-2520:36:28【问题描述】:我正在尝试组合一个查询,该查询将获取每个用户最后一次购买的日期、购买金额和交易次数。我... 查看详情

如何查找在 SQL Server 表中插入或更新行的时间

】如何查找在SQLServer表中插入或更新行的时间【英文标题】:HowtofindwhenarowisinsertedorupdatedinSQLServertable【发布时间】:2012-01-3116:46:45【问题描述】:我在SQLServer中有一个表,但是当值插入表中时没有显示列。而且我也不想创建一... 查看详情

SQL Server:如何根据最近的日期时间检索所有记录

】SQLServer:如何根据最近的日期时间检索所有记录【英文标题】:SQLServer:Howtoretrieveallrecordbasedonrecentdatetime【发布时间】:2021-12-1917:43:01【问题描述】:首先,如果在其他地方问过这个问题,我很抱歉,因为我找不到任何解决方... 查看详情