Sql 检查表中的同一天
我的考勤表中有以下数据:Sql 检查表中的同一天,sql,sql-server-2008,Sql,Sql Server 2008,我的考勤表中有以下数据: Staff_ID | User_Attend_Date | Business_Day S01 | 2013-05-01 15:18:45.537 | 2013-05-01 S01 | 2013-05-02 00:00:00.000 | 2013-05-01 S02 | 2013-05-03 06:20:30.225 | 2013-05-02 我想显示一个新列,以检查员工入住
Staff_ID | User_Attend_Date | Business_Day
S01 | 2013-05-01 15:18:45.537 | 2013-05-01
S01 | 2013-05-02 00:00:00.000 | 2013-05-01
S02 | 2013-05-03 06:20:30.225 | 2013-05-02
我想显示一个新列,以检查员工入住日期减去3小时后是否与工作日相同。如果与工作日相同,则保留用户出席日期。我的工作日数据类型为日期,其他2列为日期时间。结果如下:
Staff_ID | User_Attend_Date | Business_Day | Check_Same_Day
S01 | 2013-05-01 15:18:45.537 | 2013-05-01 | 2013-05-01 15:18:45.537
S01 | 2013-05-02 00:00:00.000 | 2013-05-01 | 2013-05-01 15:18:45.537
S02 | 2013-05-03 06:20:30.225 | 2013-05-02 | 2013-05-03 06:20:30.225
我尝试了下面的代码,但是没有达到效果
SELECT *, Case WHEN DATEADD(hh, -3, User_Attend_Date)=Business_Day
THEN User_Attend_Date ELSE BusinessDay END As 'Check_Same_Day' FROM tblAttendance
我尝试过分区使用,但也失败了
DATEADD(hh, -3, User_Attend_Date) OVER (PARTITION BY BusinessDay) AS 'Check_Same_Day'
希望有人能教我。谢谢要将datetime更改为启用日期,请使用:
SELECT DATEADD(d, DATEDIFF(d, 0, GETDATE()), 0), GETDATE()
因此,在您的情况下,您可以使用此项来与营业日
SELECT Case WHEN DATEADD(d, DATEDIFF(d, 0, DATEADD(hour, -3, User_Attend_Date)), 0) = Business_Day
编辑
实际上,您希望为用户使用任何给定日期的第一次登录,因此您可以使用CTEs来实现这一点。我已经添加了一个“expect”列(您可以很容易地删除),我假设您必须有一个用户id来识别用户?如果是,请尝试:
请注意,现在强制转换有点多余:,要在多个用户中查看它:。最终结果,不带Expect
,因为列处于打开状态
编辑2
如果您不需要用户Id分组,那么它就简单到():
原始答案(根据解释预期结果如何组合的新信息,不再相关) 全文(): 我看到两种选择: 1) 日期差异:
SELECT Case WHEN datediff(day,DATEADD(hh, -3, User_Attend_Date),Business_Day) < 1
THEN User_Attend_Date ELSE BusinessDay END As 'Check_Same_Day' FROM tblAttendance
您就快到了,问题是您需要将DATEADD的结果转换为日期(而不是DATETIME):
这将给出您想要的结果,显示其中两项符合您的规则。您需要将第一列(datetime)转换为日期,以便与日期进行比较
SELECT
*,
CASE WHEN CAST(DATEADD(HOUR,-4,User_Attend_Date) AS DATE)=Business_Day
THEN User_Attend_Date
ELSE Business_Day
END AS Check_Same_Day
FROM #test
我认为这是在第行显示秒值,因为对于Bussiness\u day有数据类型DATE,对于其他列有数据类型DATETIME 那么在sql 2008中使用日期数据类型是可能的吗 SELECT USER_ATTEND_DATE,SUBSTRING(CAST(BUSINESS_DAY AS VARCHAR(20)),0,13)AS BUSINESS_DAY, CASE WHEN DATEADD(hh, -3, User_Attend_Date) = Business_Day THEN Business_Day ELSE DATEADD(hh, -3, User_Attend_Date) END CHECK_SAME_DAY FROM attendance 选择用户参加日期,子字符串(CAST(BUSINESS_DAY作为VARCHAR(20)),0,13作为BUSINESS_DAY, 案例 当DATEADD(hh,-3,用户出席日期)=营业日 然后是工作日 ELSE DATEADD(hh,-3,用户参加日期) 当天结束检查 出席人数
如果“工作日”中的值只是“用户参加日期”的年-月-日部分,则该列是多余的,不需要。你到底想找什么?我不太明白你的预期结果;第二排
2013-05-02 00:00:00.000,2013-05-01
如何变成2013-05-01 15:18:45.537
,这是因为员工可能会报到两次。因此我需要减去3小时来检查员工是否在同一工作日工作。如果是同一个工作日,将使用第一个入住日期时间作为同一天的入住时间,这是我的客户的要求。Thanks@HowardHee. 我假设每一行上都必须有一个用户id,并且您希望按每个用户执行此操作吗?看看我的答案的新编辑。我已经包含了一个sql FIDLE,以便您可以快速查看它的功能。我在SQLFIDLE中运行查询,但第二条记录的检查日期是“2013-05-02 00:00:00.000”,假设是“2013-05-01 15:18:45.537”。Thanks@HowardHee. 我在顶部更新了一个新的编辑,它使用CTEs,对你有用。@HowardHee。如果我误解了,你没有一个userId列(你不是为每个用户都这样做),那么我添加了第二个没有userId列的编辑。你的答案很好!谢谢你花时间给我解释。我真的很感激。
SELECT Case WHEN datediff(day,DATEADD(hh, -3, User_Attend_Date),Business_Day) < 1
THEN User_Attend_Date ELSE BusinessDay END As 'Check_Same_Day' FROM tblAttendance
SELECT Case WHEN Cast(DATEADD(hh, -3, User_Attend_Date) as Date) = Business_Day
THEN User_Attend_Date ELSE BusinessDay END As 'Check_Same_Day' FROM tblAttendance
DECLARE @att TABLE
(
User_Attend_Date DATETIME,
Business_Day DATE
)
INSERT INTO @att
SELECT '2013-05-01 15:18:45.537', '2013-05-01'
UNION ALL
SELECT '2013-05-02 00:00:00.000', '2013-05-01'
UNION ALL
SELECT '2013-05-03 06:20:30.225', '2013-05-02'
SELECT
User_Attend_Date,
Business_Day,
CASE
WHEN CAST(DATEADD(hh, -3, User_Attend_Date) AS DATE) = Business_Day THEN User_Attend_Date
ELSE Business_Day
END AS 'Check_Same_Day'
FROM @att
SELECT
*,
CASE WHEN CAST(DATEADD(HOUR,-4,User_Attend_Date) AS DATE)=Business_Day
THEN User_Attend_Date
ELSE Business_Day
END AS Check_Same_Day
FROM #test
SELECT USER_ATTEND_DATE,SUBSTRING(CAST(BUSINESS_DAY AS VARCHAR(20)),0,13)AS BUSINESS_DAY,
CASE
WHEN DATEADD(hh, -3, User_Attend_Date) = Business_Day
THEN Business_Day
ELSE DATEADD(hh, -3, User_Attend_Date)
END CHECK_SAME_DAY
FROM attendance