SQL Server日期时间未正确显示

SQL Server日期时间未正确显示,sql,sql-server,date,datetime,Sql,Sql Server,Date,Datetime,我为员工在过去一周的指定日期(2018年7月1日至8日)的第一名和最后一名创建了查询。我的问题是: select CredentialId, Value as Department, UID1FirstName +' '+ UID1LastName as EmployeeName, FIRSTIN, LASTOUT, DATEDIFF(HOUR, FIRSTIN, LASTOUT) as NUMBEROFHOUR

我为员工在过去一周的指定日期(2018年7月1日至8日)的第一名和最后一名创建了查询。我的问题是:

select  
        CredentialId,
        Value as Department,
        UID1FirstName +' '+ UID1LastName as EmployeeName,
        FIRSTIN, LASTOUT,
        DATEDIFF(HOUR, FIRSTIN, LASTOUT) as NUMBEROFHOURS from 
(
    select 
        CAST(dtDate as date) as LogDate,
        MIN(CASE when ReaderName like '%ENTRY%' then dtDate END) as FIRSTIN,
        MAX(CASE when ReaderName like '%EXIT%' then dtDate END) as LASTOUT,
        CredentialId, 
        UID1FirstName,
        UID1LastName,
        Value

    from Log_Transactions

    inner join UserCredentials on UID1 = CredentialId
    inner join UserDefinedFields on HostUserId = UserID

    where dtDate between '2018-07-01' and '2018-07-08' and  --EDIT DATES INSIDE, FORMATTED AS YY-MM-DD
            UID1FirstName like '%JASTINE%' and              --EDIT NAME INSIDE THE PERCENT SYMBOLS
            Event = '2000' and FieldNo = '1'

    group by
          CAST(dtDate as DATE), CredentialId, UID1FirstName, UID1LastName, Value
)
as DT;
下面是该查询的结果:

我的问题是,当我输入此人的dtDate并将datetime转换为time时,只是为了方便地查看FirstIN和LastOUT的记录,FirstIN和LastOUT的值显示为空,其他输出为空

下面是添加的查询:

select  
        CredentialId,
        Value as Department,
        UID1FirstName +' '+ UID1LastName as EmployeeName,
        convert(varchar(18), dtDate,1) as LogDATE,
        FIRSTIN, LASTOUT,
        DATEDIFF(HOUR, FIRSTIN, LASTOUT) as NUMBEROFHOURS from 
(
    select 
        CAST(dtDate as date) as LogDate,
        MIN(CASE when ReaderName like '%ENTRY%' then convert(varchar(18), dtDate,108) END) as FIRSTIN,
        MAX(CASE when ReaderName like '%EXIT%' then convert(varchar(18), dtDate,108) END) as LASTOUT,
        CredentialId, 
        UID1FirstName,
        UID1LastName,
        Value,
        dtDate

    from Log_Transactions

    inner join UserCredentials on UID1 = CredentialId
    inner join UserDefinedFields on HostUserId = UserID

    where dtDate between '2018-07-01' and '2018-07-08' and  --EDIT DATES INSIDE, FORMATTED AS YY-MM-DD
            UID1FirstName like '%JASTINE%' and              --EDIT NAME INSIDE THE PERCENT SYMBOLS
            Event = '2000' and FieldNo = '1'

    group by
          CAST(dtDate as DATE), CredentialId, UID1FirstName, UID1LastName, Value, dtDate
)
as DT;
下面是添加查询的结果:

select  
        CredentialId,
        Value as Department,
        UID1FirstName +' '+ UID1LastName as EmployeeName,
        convert(varchar(18), dtDate,1) as LogDATE,
        FIRSTIN, LASTOUT,
        DATEDIFF(HOUR, FIRSTIN, LASTOUT) as NUMBEROFHOURS from 
(
    select 
        CAST(dtDate as date) as LogDate,
        MIN(CASE when ReaderName like '%ENTRY%' then convert(varchar(18), dtDate,108) END) as FIRSTIN,
        MAX(CASE when ReaderName like '%EXIT%' then convert(varchar(18), dtDate,108) END) as LASTOUT,
        CredentialId, 
        UID1FirstName,
        UID1LastName,
        Value,
        dtDate

    from Log_Transactions

    inner join UserCredentials on UID1 = CredentialId
    inner join UserDefinedFields on HostUserId = UserID

    where dtDate between '2018-07-01' and '2018-07-08' and  --EDIT DATES INSIDE, FORMATTED AS YY-MM-DD
            UID1FirstName like '%JASTINE%' and              --EDIT NAME INSIDE THE PERCENT SYMBOLS
            Event = '2000' and FieldNo = '1'

    group by
          CAST(dtDate as DATE), CredentialId, UID1FirstName, UID1LastName, Value, dtDate
)
as DT;

以下是我想要生成的示例输出:


谢谢你的帮助

尝试在最外面的
上设置格式,选择
,因为子查询中的数据已正确分组,不需要额外转换

select  
        CredentialId,
        Value as Department,
        UID1FirstName +' '+ UID1LastName as EmployeeName,
        CONVERT(DATE, FIRSTIN) AS LogDATE,
        CONVERT(VARCHAR(18), FIRSTIN, 108) AS FIRSTIN,
        CONVERT(VARCHAR(18), LASTOUT, 108) AS LASTOUT,
        DATEDIFF(HOUR, FIRSTIN, LASTOUT) as NUMBEROFHOURS from 
(
    select 
        CAST(dtDate as date) as LogDate,
        MIN(CASE when ReaderName like '%ENTRY%' then dtDate END) as FIRSTIN,
        MAX(CASE when ReaderName like '%EXIT%' then dtDate END) as LASTOUT,
        CredentialId, 
        UID1FirstName,
        UID1LastName,
        Value

    from Log_Transactions

    inner join UserCredentials on UID1 = CredentialId
    inner join UserDefinedFields on HostUserId = UserID

    where dtDate between '2018-07-01' and '2018-07-08' and  --EDIT DATES INSIDE, FORMATTED AS YY-MM-DD
            UID1FirstName like '%JASTINE%' and              --EDIT NAME INSIDE THE PERCENT SYMBOLS
            Event = '2000' and FieldNo = '1'

    group by
          CAST(dtDate as DATE), CredentialId, UID1FirstName, UID1LastName, Value
)
as DT;

问题是什么?你改变了小组,这就是你得到的。为什么要这样做,而不保持初始查询的完整性,并将其包装在另一个select中以更改字段格式?在同一行上是否有类似Entry或Exit的读取器名称?如果不是,Case的结束条件将始终返回First-In或First-Out列的null。是。根据日期和时间,我在每一行上都有一个进入和退出的ReaderName。当我将dtDate添加到Group by时,它不会显示最小和最大时间,而是根据条件显示所有结果,但当我删除Group by上的dtDate时,它会显示一个错误,如:Msg 8120,级别16,状态1,第19行“Log_Transactions.dtDate”列在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中。