[英]find the min date (Closest to current date) if dates lies in future date and max date (closest to current date) if dates lies in past dates in 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.