Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 检查表中的同一天_Sql_Sql Server 2008 - Fatal编程技术网

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