欧盟申根协议允许来自 50 个国家的游客在过去 180 天中停留 90 天。如果您于2023年2月1日入境并于2023年5月1日停留90天;到年底为止的每一天,您可以在申根区内再次停留多少天?
我使用 Excel 计算出,如果我于 2023 年 9 月 1 日返回,则在过去 180 天内,我在该区域内待了 59 天,因为这 180 天的开始日期是 2023 年 3 月 5 日。到 10 月为止,累计总计仍为 59 天2023 年 9 月 1 日,该区域内的所有日期均从 2023 年 9 月 1 日开始计算。
有没有 SQL 语句可以帮我完成这个计算?
我确实创建了一个包含 2 年日期的临时表,并标记了区域内部和外部的日期。但这是硬编码到这些日期的。如果代码可以通用,那么就可以进行规划。显示最早可能返回(2023 年 8 月 1 日)和/或要求的退出日期(如果您被允许在该特定日期返回)。
DROP TABLE IF EXISTS #Vaca
CREATE TABLE #Vaca
(
VacationDate date
,[Location] nvarchar(100)
,InEu int
)
DECLARE @n int = 0
,@StartDate date = N'2022/06/01'
WHILE @n < 730
BEGIN
INSERT INTO #Vaca
(
VacationDate
,[Location]
,InEu
)
VALUES (@StartDate
,CASE WHEN @StartDate BETWEEN N'2023/02/01' and N'2023/05/01'THEN N'EU'
WHEN @StartDate BETWEEN N'2023/09/01' and N'2023/11/29'THEN N'EU'
ELSE N'Outside EU'
END
,CASE WHEN @StartDate BETWEEN N'2023/02/01' and N'2023/05/01'THEN 1
WHEN @StartDate BETWEEN N'2023/09/01' and N'2023/11/29'THEN 1
ELSE 0
END
)
SET @n += 1
SET @StartDate = DATEADD(DAY, 1, @StartDate)
END
SELECT v.[Location]
,v.VacationDate
,SUM(v.InEu) OVER ( ORDER BY v.VacationDate ASC
ROWS 179 PRECEDING
) AS Test
FROM #Vaca AS v
WHERE 1 = 1
GROUP BY v.VacationDate
,v.[Location]
,v.InEu
ORDER BY 2 ASC
我没有直觉到这样一个简单的规则:如果你在申根区内度过 90 天,那么你必须在申根区之外度过 90 天。因此所需要的只是一些变量和基本的 DATEADD 函数。因此,通过 4 个变量,行程开始和结束日期可以显示为:
DECLARE @TripOneStart date = N'2023/02/01'
,@TripTwoStart date = N'2023/09/01'
,@TripOneDays int = 90
,@TripTwoDays int = 85
SELECT @TripOneStart AS TripOnetartDate
,DATEADD(DAY, @TripOneDays, @TripOneStart) AS TripOneEndDate
,DATEADD(DAY, @TripOneDays * 2, @TripOneStart) AS EarliestTripTwoStartDate
,@TripTwoStart AS TripTwoStartDate
,DATEADD(DAY, @TripTwoDays, @TripTwoStart) AS TripTwoEndDate
,DATEADD(DAY, @TripTwoDays * 2, @TripTwoStart) AS EarliestTripThreeStartDate
我没有费心进行额外的验证,以确保第二次旅行的开始时间是在最早的返回日期之后。行集为您提供了足够的信息来执行您可能需要的任何计划。