簡體   English   中英

最接近SQL中當前日期的日期(優先日期或將來的日期)

[英]Date closest to current date in SQL (prior dates or future dates)

我在尋找如何查找最接近當前日期的日期時遇到了一個問題。 我在其他地方看了一下: 獲取與當前日期最接近的日期sql

我也在這里看: https : //bytes.com/topic/sql-server/answers/79502-get-closest-date

我正在使用MS SQL 2012,並且對此有很多疑問,因此,我很抱歉將其備份。 我似乎無法使我的查詢正常工作。

基本上我有一張桌子,如下所示:

ITEMNMBR | MINDATE    | MAXDATE    | CLOSESTDATE
------------------------------------------------
123456   | 2017-10-15 | 2017-11-04 | NULL
654321   | 2017-09-29 | 2017-12-08 | NULL

當前日期是今天,“ 2017-10-03”。 我們會發現商品編號'123456'的最近購買日期是2017-10-15。 對於編號為“ 654321”的商品,最接近的購買日期是2017年9月29日,因為這種情況比下一次購買生效要花費的時間要晚得多(因此,我正在查看兩者之間差異的絕對值日期)。 您必須原諒我,但我要包含的查詢不包含“ CLOSESTDATE”列。 我將其包括在其中,是為了讓您知道我的任何計算都使該列為NULL。 所以這就是我所擁有的:

--Lines commented below are not used in the current iteration of the query
--DECLARE @dt DATETIME
--SET @dt = GETDATE()

SELECT
    I.ITEMNMBR,
    MIN(PDATE1) AS MINDATE,
    MAX(PDATE1) AS MAXDATE
FROM dbo.IV00101 I 
LEFT OUTER JOIN
    (SELECT P.[Item Number], 
    P.[Req Date] AS PDATE1 
    FROM dbo.Purchases P
    WHERE ((P.[Document Status] = 'Open') AND 
    (P.[POStat] <> 'Closed') AND 
    (P.[POStat] <> 'Received')) AND P.[Req Date] >= DATEADD(d, -15, 
    DATEDIFF(d, 0, GETDATE()))
    ) AS P ON P.[Item Number]= I.ITEMNMBR
WHERE P.[Item Number] = '123456'
GROUP BY 
    I.ITEMNMBR
ORDER BY MINDATE DESC

當我運行此查詢時,我得到的是我之前概述的表,減去“ CLOSESTDATE”列。 我要使用“ CLOSESTDATE”列顯示最接近今天的購買日期。 基本上,如果購買日期是三天前發生的,而下一個購買日期是一個月了,那么我想顯示三天前的購買日期。 同樣,可以在不使用子查詢的情況下編寫查詢,但是在還原回相當簡單的原始查詢之前,我在子查詢中使用了其他計算。 因此,查詢可以這樣寫:

SELECT
    I.ITEMNMBR,
    MIN(P.[Req Date]) AS MINDATE,
    MAX(P.[Req Date]) AS MAXDATE
FROM dbo.IV00101 I 
LEFT OUTER JOIN
    Purchases P ON P.[Item Number] = I.ITEMNMBR
WHERE P.[Item Number] = '123456' ((P.[Document Status] = 'Open') AND 
    (P.[POStat] <> 'Closed') AND 
    (P.[POStat] <> 'Received')) AND P.[Req Date] >= DATEADD(d, -15, 
    DATEDIFF(d, 0, GETDATE()))
GROUP BY 
    I.ITEMNMBR
ORDER BY MINDATE DESC

最后,如您所見,我在過去15天內有日期限制,因此任何比該日期更舊的內容都不會顯示。

提前謝謝了!

我仍然不太了解您的問題,但是我希望這能給您一個開始,您可以在這里嘗試使用rextester示例

但是在我看來,您需要一個簡單的case語句:

select ITEMNMBR
       ,case when abs(datediff(day, MINDATE, convert(date,getdate()))) > abs(datediff(day, MAXDATE, convert(date,getdate()))) then 'MINDATE is greater' else 'MAXDATE is greater' end as ClosestDate
from myTable

如果您有任何疑問,請告訴我。 我很樂意提供幫助。

我已經采用了您的數據和架構,並對我認為您的基礎數據實際上看起來是近似的。 由此,您的問題實際上非常簡單:

declare @t table(ItemNumber int, ReqDate datetime, DocumentStatus nvarchar(100), POStat nvarchar(100))
insert into @t values
 (123456,'2017-10-15','Open','Not Closed')
,(123456,'2017-11-04','Open','Not Closed')
,(654321,'2017-09-29','Open','Not Closed')
,(654321,'2017-12-08','Open','Not Closed')

,(123456,'2017-10-11','Open','Closed')
,(123456,'2017-11-01','Closed','Not Closed')
,(654321,'2017-09-21','Closed','Not Closed')
,(654321,'2017-12-01','Open','Received');

select t.ItemNumber
      ,min(t.ReqDate) as MinDate
      ,max(t.ReqDate) as MaxDate

            -- Find the difference in days for both Min and Max dates, converting to positive numbers where negative,
      ,case when abs(datediff(d,min(t.ReqDate),getdate())) < abs(datediff(d,max(t.ReqDate),getdate()))
            then min(t.ReqDate)         -- And then return the appropriate one.
            else max(t.ReqDate)
            end as ClosestDate
from @t t
where t.DocumentStatus = 'Open'
    and t.POStat not in('Closed','Received')
    and t.ReqDate >= dateadd(d,-15,cast(getdate() as date))
group by t.ItemNumber
order by MinDate desc;

輸出:

+------------+-------------------------+-------------------------+-------------------------+
| ItemNumber |         MinDate         |         MaxDate         |       ClosestDate       |
+------------+-------------------------+-------------------------+-------------------------+
|     123456 | 2017-10-15 00:00:00.000 | 2017-11-04 00:00:00.000 | 2017-10-15 00:00:00.000 |
|     654321 | 2017-09-29 00:00:00.000 | 2017-12-08 00:00:00.000 | 2017-09-29 00:00:00.000 |
+------------+-------------------------+-------------------------+-------------------------+

使用以下命令更改查詢的初始部分:

SELECT DISTINCT
I.ITEMNMBR,
MIN(PDATE1) AS MINDATE,
MAX(PDATE1) AS MAXDATE
IF(ABS(DATEDIFF(MIN(PDATE1)-SYSDATETIME())) > 
ABS(DATEDIFF(MAX(PDATE1)-SYSDATETIME())),
MAX(PDATE1),MIN(PDATE1)) as CLOSESTDATE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM