申根出入境SQL计算器

问题描述 投票:0回答:1

欧盟申根协议允许来自 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

sql tsql
1个回答
0
投票

我没有直觉到这样一个简单的规则:如果你在申根区内度过 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

我没有费心进行额外的验证,以确保第二次旅行的开始时间是在最早的返回日期之后。行集为您提供了足够的信息来执行您可能需要的任何计划。

© www.soinside.com 2019 - 2024. All rights reserved.