Msg 241, Level 16, State 1, Line 25 Conversion failed when converting date and/or time from character string.

Analyst_SQL 3,576 Reputation points
2021-07-02T12:31:10.683+00:00

Error Getting
Msg 241, Level 16, State 1, Line 25
Conversion failed when converting date and/or time from character string.

When I am mentioned 'A'
,CASE WHEN [IN(A_Date)] >=DATEADD(HOUR,12,CAST(CAST([IN(A_Date)] AS DATE) AS DATETIME)) THEN 'A' ELSE [IN(A_Date)] END [IN(A_Date)]

  Create table #EmpMaster (EnrollNumber int, empName varchar(50))
            Create table #MonthDate (Day varchar(50),D_Date date)
        Create table #AttendenceLOG (EnrollNumber int,A_Date datetime)
           Insert into #EmpMaster values (10001,'ALi')
        Insert into #EmpMaster values (10002,'Kami')
        Insert into #EmpMaster values (10003,'Jhon')
        Insert into #EmpMaster values (10004,'Muli') 
          Insert into #EmpMaster values (10005,'Rose') 

             Insert into #MonthDate values ('Sunday','2021-06-06') 
                 Insert into #MonthDate values ('Monday','2021-06-07') 
                    Insert into #MonthDate values ('Tuesday','2021-06-08') 
                       Insert into #MonthDate values ('Wednesday','2021-06-09') 


         Insert into #AttendenceLOG values (10001,'2021-06-09 08:04:00')
          Insert into #AttendenceLOG values (10001,'2021-06-09 17:45:00')
              Insert into #AttendenceLOG values (10002,'2021-06-09 10:04:00')
             Insert into #AttendenceLOG values (10003,'2021-06-09 20:04:00')
          Insert into #AttendenceLOG values (10004,'2021-06-09 07:45:00')
            Insert into #AttendenceLOG values (10004,'2021-06-09 09:45:00')
               Insert into #AttendenceLOG values (10004,'2021-06-09 20:35:00')


;with cte as (
 select a.EnrollNumber,b.D_Date,b.Day,c.A_Date 
 from #EmpMaster a 
 cross join #MonthDate b
 left join #AttendenceLOG c 
 on a.EnrollNumber=c.EnrollNumber 
 and cast(c.A_Date as date)=b.D_Date)
 ,cte1 AS (
 SELECT  EnrollNumbeR,D_Date,Day
 ,MIN(A_Date) [IN(A_Date)],MAX(A_Date) [OUT(A_Date)]
 FROM CTE 
 GROUP BY EnrollNumbeR,D_Date,Day)
 ,CTE2 AS (
 SELECT EnrollNumbeR,D_Date,Day
 ,CASE WHEN [IN(A_Date)] >=DATEADD(HOUR,12,CAST(CAST([IN(A_Date)] AS DATE) AS DATETIME)) THEN 'A' ELSE [IN(A_Date)] END [IN(A_Date)]
 ,CASE WHEN [OUT(A_Date)] >=DATEADD(HOUR,12,CAST(CAST([OUT(A_Date)] AS DATE) AS DATETIME)) THEN [OUT(A_Date)] ELSE NULL END [OUT(A_Date)]
 FROM cte1)
 SELECT *
 ,CASE WHEN [DAY] ='Sunday' THEN 'S'
       WHEN [IN(A_Date)] IS NULL AND [OUT(A_Date)] IS NULL THEN 'A'
     WHEN DATEDIFF(HOUR,[IN(A_Date)],[OUT(A_Date)])>=8 THEN 'P'
     ELSE 'A' END STATUS,
 CASE WHEN [IN(A_Date)] IS NOT NULL AND [OUT(A_Date)] IS NOT NULL AND DATEDIFF(HOUR,[IN(A_Date)],[OUT(A_Date)])>=8 
 THEN CAST(CAST(DATEDIFF(MINUTE,[IN(A_Date)],[OUT(A_Date)]) AS FLOAT)/60 AS decimal(10,2)) ELSE 0 END [HOUR]
 FROM CTE2
 ORDER BY D_Date,EnrollNumbeR
Developer technologies | Transact-SQL
SQL Server | Other
0 comments No comments
{count} votes

Accepted answer
  1. MelissaMa-MSFT 24,221 Reputation points
    2021-07-05T02:14:10.953+00:00

    Hi @Analyst_SQL ,

    Please also refer below:

     ;with cte as (  
     select a.EnrollNumber,b.D_Date,b.Day,c.A_Date   
     from #EmpMaster a   
     cross join #MonthDate b  
     left join #AttendenceLOG c   
     on a.EnrollNumber=c.EnrollNumber   
     and cast(c.A_Date as date)=b.D_Date)  
     ,cte1 AS (  
     SELECT  EnrollNumbeR,D_Date,Day  
     ,MIN(A_Date) [IN(A_Date)],MAX(A_Date) [OUT(A_Date)]  
     FROM CTE   
     GROUP BY EnrollNumbeR,D_Date,Day)  
     ,CTE2 AS (  
     SELECT EnrollNumbeR,D_Date,Day  
     ,CASE WHEN [IN(A_Date)] >=DATEADD(HOUR,12,CAST(CAST([IN(A_Date)] AS DATE) AS DATETIME)) THEN NULL ELSE [IN(A_Date)] END [IN(A_Date)]  
     ,CASE WHEN [OUT(A_Date)] >=DATEADD(HOUR,12,CAST(CAST([OUT(A_Date)] AS DATE) AS DATETIME)) THEN [OUT(A_Date)] ELSE NULL END [OUT(A_Date)]  
     FROM cte1)  
     ,CET3 as (  
     SELECT *  
     ,CASE WHEN [DAY] ='Sunday' THEN 'S'  
           WHEN [IN(A_Date)] IS NULL AND [OUT(A_Date)] IS NULL THEN 'A'  
         WHEN DATEDIFF(HOUR,[IN(A_Date)],[OUT(A_Date)])>=8 THEN 'P'  
         ELSE 'A' END STATUS,  
     CASE WHEN [IN(A_Date)] IS NOT NULL AND [OUT(A_Date)] IS NOT NULL AND DATEDIFF(HOUR,[IN(A_Date)],[OUT(A_Date)])>=8   
     THEN CAST(CAST(DATEDIFF(MINUTE,[IN(A_Date)],[OUT(A_Date)]) AS FLOAT)/60 AS decimal(10,2)) ELSE 0 END [HOUR]  
     FROM CTE2)  
     SELECT EnrollNumbeR,D_Date,Day  
     ,CASE WHEN [IN(A_Date)] IS NULL AND [OUT(A_Date)] IS NULL AND [STATUS]='A'   
     THEN [STATUS]   
     ELSE CONVERT(varchar(30),[IN(A_Date)],121)   
     END [IN(A_Date)]  
     ,[OUT(A_Date)],[STATUS],[HOUR]  
     FROM CET3  
      ORDER BY D_Date,EnrollNumbeR  
    

    Output:
    111671-output.png

    If above is not working, please provide the rule of [IN(A_Date)] ='A'. Thanks.

    Best regards,
    Melissa


    If the answer is helpful, please click "Accept Answer" and upvote it.
    Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.

    1 person found this answer helpful.

3 additional answers

Sort by: Most helpful
  1. Naomi Nosonovsky 8,431 Reputation points
    2021-07-02T16:35:58.633+00:00

    You can not have 'A' and an actual date as a result. You need to have some date placeholder for the first case or otherwise convert to character your actual date value.


  2. tibor_karaszi@hotmail.com 4,316 Reputation points
    2021-07-03T17:28:45.173+00:00

    You are converting the expression you check against NULL. That is not what I was referring to. You need to convert the output:

    CASE WHEN [IN(A_Date)] >=DATEADD(HOUR,12,CAST(CAST([IN(A_Date)] AS DATE) AS DATETIME)) THEN 'A' ELSE CONVERT([IN(A_Date)] AS varchar(40)) END

    Now both results are strings: 'A' and CONVERT([IN(A_Date)] AS varchar(40)).


  3. Stacy Clark 31 Reputation points
    2021-07-06T10:12:30.047+00:00

    Default value should be converted to the data type of column by query executor.

    Date data type requires data in " YYYY-mm-dd" fromat.


Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.