如何检查 sql 中是否有最近 2 天的数据
how to check if there is data for the last 2 days in sql
我想检查用户是否提交了过去 2 天的数据。我的 table 中有 2 个字段:USERID 和 DATE_SUBMITTED。我的 table 中确实有过去 2 天的数据,但我的查询没有返回任何数据。我在这里做错了什么:
select distinct [UserID], DT_Submitted
from myTable
where [UserID] = 'Joe'
and DT_Submitted = (select CAST(FLOOR( CAST( GETDATE()-1 AS FLOAT ) )AS DATETIME))
and DT_Submitted = (select CAST(FLOOR( CAST( GETDATE()-2 AS FLOAT ) )AS DATETIME))
谢谢
您想查找USERID 昨天和前天提交的记录。你需要这样的东西:
SELECT
userID,
Dt_Submitted
FROM
myTable
WHERE
userid = 'Joe' AND
userid IN (SELECT distinct userid FROM myTable Where Dt_Submitted = dateadd(day, -2, getdate())) AND
userid IN (SELECT distinct userid FROM myTable Where Dt_Submitted = dateadd(day, -1, getdate()))
如果您有更新版本的 SQL 服务器使用 Window 函数:
SELECT
*
FROM
(
SELECT
userID,
Dt_Submitted,
CASE
WHEN
MAX(Dt_Submitted) OVER (PARTITION BY userid ORDER BY dt_submitted ROWS UNBOUNDED PRECEDING) = dateAdd(day, -1, dt_submitted) ORDER
MIN(Dt_Submitted) OVER (PARTITION BY userid ORDER BY dt_submitted ROWS UNBOUNDED FOLLOWING) = dateAdd(day, +1, dt_submitted)
THEN 'X' as keeptest
FROM
myTable
WHERE
userid = 'Joe' AND
)sub
WHERE keeptest = 'X'
或使用 JOIN 删除记录(与第一个非常相似):
SELECT
t1.userID,
t1.Dt_Submitted
FROM
myTable t1
INNER JOIN (SELECT distinct userid, dt_submitted FROM myTable Where Dt_Submitted = dateadd(day, -2, getdate())) t2 ON
t1.userid = t2.userid
AND t1.dt_submitted = t2.dt_submitted
INNER JOIN (SELECT distinct userid,dt_submitted FROM myTable Where Dt_Submitted = dateadd(day, -1, getdate())) t3 ON
t1.userid = t3.userid
AND t1.dt_submitted = t3.dt_submitted
WHERE
t1.userid = 'Joe'
以前的人已经回答了,但我相信他们工作太辛苦了,可能使用了更多的资源与多个连接和差异等...试试这个。
SELECT UserID,
DT_Submitted INTO myTable
FROM
(
--Submitted both days
SELECT 'Joe' UserID,DATEADD(DAY,-1,GETDATE()) DT_Submitted
UNION ALL
SELECT 'Joe' UserID,DATEADD(DAY,-2,GETDATE()) DT_Submitted
UNION ALL
--Submitted one day
SELECT 'Bob',DATEADD(DAY,-1,GETDATE()) DT_Submitted
UNION ALL
--Submitted 5 days ago
SELECT 'Helen',DATEADD(DAY,-5,GETDATE()) DT_Submitted
) A
SELECT *
FROM
(
SELECT UserID,
--All this does is count the submissions in the past two days and then adds them up
SUM(CASE
WHEN CAST(DT_submitted AS DATE) = DATEADD(DAY,-1,CAST(GETDATE() AS DATE)) THEN 1
WHEN CAST(DT_submitted AS DATE) = DATEADD(DAY,-2,CAST(GETDATE() AS DATE)) THEN 1
ELSE 0
END) AS submissions
FROM myTable
GROUP BY UserID
) A
WHERE submissions = 2
结果:
UserID submissions
------ -----------
Joe 2
我想检查用户是否提交了过去 2 天的数据。我的 table 中有 2 个字段:USERID 和 DATE_SUBMITTED。我的 table 中确实有过去 2 天的数据,但我的查询没有返回任何数据。我在这里做错了什么:
select distinct [UserID], DT_Submitted
from myTable
where [UserID] = 'Joe'
and DT_Submitted = (select CAST(FLOOR( CAST( GETDATE()-1 AS FLOAT ) )AS DATETIME))
and DT_Submitted = (select CAST(FLOOR( CAST( GETDATE()-2 AS FLOAT ) )AS DATETIME))
谢谢
您想查找USERID 昨天和前天提交的记录。你需要这样的东西:
SELECT
userID,
Dt_Submitted
FROM
myTable
WHERE
userid = 'Joe' AND
userid IN (SELECT distinct userid FROM myTable Where Dt_Submitted = dateadd(day, -2, getdate())) AND
userid IN (SELECT distinct userid FROM myTable Where Dt_Submitted = dateadd(day, -1, getdate()))
如果您有更新版本的 SQL 服务器使用 Window 函数:
SELECT
*
FROM
(
SELECT
userID,
Dt_Submitted,
CASE
WHEN
MAX(Dt_Submitted) OVER (PARTITION BY userid ORDER BY dt_submitted ROWS UNBOUNDED PRECEDING) = dateAdd(day, -1, dt_submitted) ORDER
MIN(Dt_Submitted) OVER (PARTITION BY userid ORDER BY dt_submitted ROWS UNBOUNDED FOLLOWING) = dateAdd(day, +1, dt_submitted)
THEN 'X' as keeptest
FROM
myTable
WHERE
userid = 'Joe' AND
)sub
WHERE keeptest = 'X'
或使用 JOIN 删除记录(与第一个非常相似):
SELECT
t1.userID,
t1.Dt_Submitted
FROM
myTable t1
INNER JOIN (SELECT distinct userid, dt_submitted FROM myTable Where Dt_Submitted = dateadd(day, -2, getdate())) t2 ON
t1.userid = t2.userid
AND t1.dt_submitted = t2.dt_submitted
INNER JOIN (SELECT distinct userid,dt_submitted FROM myTable Where Dt_Submitted = dateadd(day, -1, getdate())) t3 ON
t1.userid = t3.userid
AND t1.dt_submitted = t3.dt_submitted
WHERE
t1.userid = 'Joe'
以前的人已经回答了,但我相信他们工作太辛苦了,可能使用了更多的资源与多个连接和差异等...试试这个。
SELECT UserID,
DT_Submitted INTO myTable
FROM
(
--Submitted both days
SELECT 'Joe' UserID,DATEADD(DAY,-1,GETDATE()) DT_Submitted
UNION ALL
SELECT 'Joe' UserID,DATEADD(DAY,-2,GETDATE()) DT_Submitted
UNION ALL
--Submitted one day
SELECT 'Bob',DATEADD(DAY,-1,GETDATE()) DT_Submitted
UNION ALL
--Submitted 5 days ago
SELECT 'Helen',DATEADD(DAY,-5,GETDATE()) DT_Submitted
) A
SELECT *
FROM
(
SELECT UserID,
--All this does is count the submissions in the past two days and then adds them up
SUM(CASE
WHEN CAST(DT_submitted AS DATE) = DATEADD(DAY,-1,CAST(GETDATE() AS DATE)) THEN 1
WHEN CAST(DT_submitted AS DATE) = DATEADD(DAY,-2,CAST(GETDATE() AS DATE)) THEN 1
ELSE 0
END) AS submissions
FROM myTable
GROUP BY UserID
) A
WHERE submissions = 2
结果:
UserID submissions
------ -----------
Joe 2