Sql 在同一列中查找Datediff
我有一个跨越边界的数据表。A希望护照名至少有一个BorderCrossingDateTime间隔,时间间隔大于4个月Sql 在同一列中查找Datediff,sql,Sql,我有一个跨越边界的数据表。A希望护照名至少有一个BorderCrossingDateTime间隔,时间间隔大于4个月 BorderCrossingID PassportNumber BorderCrossingDateTime 1 ER-2222 2019-01-07 22:11:12.000 2 ER-2222 2019-01-07 23:11:12.000 3
BorderCrossingID PassportNumber BorderCrossingDateTime
1 ER-2222 2019-01-07 22:11:12.000
2 ER-2222 2019-01-07 23:11:12.000
3 KL-5233 2018-10-03 17:10:39.000
130 FF-4444 2019-01-08 11:11:11.000
5 ER-1111 NULL
6 KL-5686 NULL
7 ER-1111 NULL
8 KL-5235 NULL
9 QW-5656 NULL
10 DF-5685 NULL
11 KL-4558 NULL
--------
113 LL-8989 2019-01-15 16:24:26.333
114 ZZ-0005 2019-01-17 16:18:12.273
115 LL-0223 2019-01-17 16:19:12.000
116 ER-2222 2019-01-03 08:24:29.000
117 ER-2222 2019-02-01 08:25:03.873
118 ER-2222 2019-03-13 08:25:17.000
119 ER-2222 2019-04-10 08:25:32.000
120 ER-2222 2019-09-30 08:25:47.000
我已经得到了边界,有了边界日期时间,并把它们整理好了
SELECT DISTINCT PassportNumber, BorderCrossingDateTime FROM Passports
WHERE DATEDIFF(Compare 2 upcoming DateTimes)
EXCEPT
SELECT PassportNumber, BorderCrossingDateTime FROM Passports
WHERE BorderCrossingDateTime IS NULL
ORDER BY BorderCrossingDateTime
结果应该是这样的:
PassportName
ER-2222
TO-0140
NN-4444
TP-0140
TT-0140
WU-5645
下面的代码将起作用。我已经在SQLServer中进行了测试。我正在使用,函数查找上一个、下一个过境日期
CREATE TABLE #borderCrossing (BorderCrossingID INT, PassportNumber VARCHAR(10), BorderCrossingDateTime DATETIME)
INSERT INTO #borderCrossing
VALUES (1, 'ER-2222', '2019-01-07 22:11:12.000'), (2, 'ER-2222', '2019-03-07 22:11:12.000'), (3, 'ER-2222', '2019-08-07 22:11:12.000');
SELECT DISTINCT PassportNumber
FROM (
SELECT BorderCrossingId, BorderCrossingDateTime AS CurrentBorderCrossingDateTime, passportNumber, lag(BorderCrossingDateTime, 1, NULL) OVER (
PARTITION BY passportNumber ORDER BY BorderCrossingDateTime
) AS prevBorderCrossingDateTime, lead(BorderCrossingDateTime, 1, NULL) OVER (
PARTITION BY passportNumber ORDER BY BorderCrossingDateTime
) AS nextBorderCrossingDateTime
FROM #borderCrossing
) AS t
WHERE DATEDIFF(mm, prevBorderCrossingDateTime, nextBorderCrossingDateTime) > 4
下面的代码将起作用。我已经在SQLServer中进行了测试。我正在使用,函数查找上一个、下一个过境日期
CREATE TABLE #borderCrossing (BorderCrossingID INT, PassportNumber VARCHAR(10), BorderCrossingDateTime DATETIME)
INSERT INTO #borderCrossing
VALUES (1, 'ER-2222', '2019-01-07 22:11:12.000'), (2, 'ER-2222', '2019-03-07 22:11:12.000'), (3, 'ER-2222', '2019-08-07 22:11:12.000');
SELECT DISTINCT PassportNumber
FROM (
SELECT BorderCrossingId, BorderCrossingDateTime AS CurrentBorderCrossingDateTime, passportNumber, lag(BorderCrossingDateTime, 1, NULL) OVER (
PARTITION BY passportNumber ORDER BY BorderCrossingDateTime
) AS prevBorderCrossingDateTime, lead(BorderCrossingDateTime, 1, NULL) OVER (
PARTITION BY passportNumber ORDER BY BorderCrossingDateTime
) AS nextBorderCrossingDateTime
FROM #borderCrossing
) AS t
WHERE DATEDIFF(mm, prevBorderCrossingDateTime, nextBorderCrossingDateTime) > 4
大家好,欢迎来到Stack Overflow。请在标记中指定您正在使用的DBMS(SQL Server、MySQL等):)@Brokkoli。你怎么知道他们要往哪个方向走?你是在寻找只在边境一侧生活4个月的人吗?这是我得到的任务。我不得不提出7个问题,最后一个是上面的问题。无论如何,在程序中,数字是一个参数,所以它是可变的。您好,欢迎来到堆栈溢出。请在标记中指定您正在使用的DBMS(SQL Server、MySQL等):)@Brokkoli。你怎么知道他们要往哪个方向走?你是在寻找只在边境一侧生活4个月的人吗?这是我得到的任务。我不得不提出7个问题,最后一个是上面的问题。无论如何,在程序中,数字是一个参数,因此可以更改。谢谢!这很有帮助!我将主要部分改为“基本”BorderCrossingDateTime,以便在只有两个DateTime的情况下使用PassportName。再次感谢!非常感谢。这很有帮助!我将主要部分改为“基本”BorderCrossingDateTime,以便在只有两个DateTime的情况下使用PassportName。再次感谢!