SQL Server 如何比较2个格式化字段并将其用于where子句条件

o7jaxewo  于 2023-01-12  发布在  其他
关注(0)|答案(3)|浏览(160)

我一直在尝试将1字段与其自身进行比较,方法是将其转换为“ddMMyyyy”并尝试执行它
数据示例:

User    | DateTime
AU      | 01-04-2022 11:11:11
AU      | 01-04-2022 12:09:30
SG      | 04-08-2023 03:23:01
NA      | 21-11-2022 15:10:40

我试过这样做,日期时间由一些日期和时间数据组成,原始格式为“01-01-2022 11:12:09”

select *
    format(DateTime, 'ddMMyyyy') AS DT
where DT != DT FROM TblUser

有什么办法吗?
我对此的期望是,它将显示DT不具有与自身相同值的字段。
预期结果为:

User    | DateTime
SG      | 04082023
NA      | 21112022
fwzugrvs

fwzugrvs1#

一个选项是使用WITH TIES。
我不喜欢使用format(),特别是对于大表。

    • 示例**
Select top 1 with ties 
       [User]
      ,[DateTime] = format([Datetime],'ddMMyyyy')
 From TblUser
 Order By sum(1) over (partition by [User],convert(date,[DateTime]))
    • 结果**
User    DateTime
NA      21112022
SG      04082023
    • 编辑:如果您的[DateTime]列碰巧是字符串**
Select top 1 with ties 
       [User]
      ,[DateTime] = replace(left([DateTime],10),'-','')
 From TblUser
 Order By sum(1) over (partition by [User],left([DateTime],10))
s6fujrry

s6fujrry2#

为了进行比较,我假设您需要“日期”不带时间的行。(实际上,如果数据类型为datetime,则任何“仅日期”也将具有00:00:00.000的时间。)因此,要忽略时间(除了那些时间不在00:00:00.000的行),请将日期类型从datetime转换为date
注意:子句的顺序必须为SELECTFROMWHERE

SELECT
      TblUser.*
    , format([DateTime], 'ddMMyyyy') AS DT
FROM TblUser
WHERE [DateTime] != convert(date,[DateTime])

如果您真的需要使用column alias“DT”,那么您需要这样的derived table

SELECT
    format(DT, 'ddMMyyyy') AS DTfinal
FROM (
    SELECT
          TblUser.*
        , convert(date,[DateTime]) AS DT -- the "column alias" is created here
    FROM TblUser
     ) AS derived
WHERE DT != [DateTime] -- now you can use the "column alias" DT

但是在形成列“DT”时不要使用format(),因为您无法可靠地将字符串(ddMMyyyy格式)与datedatetime值进行比较。

nb:format()函数返回一个字符串,即使您认为ddMMyyyy表示日期。

gr8qqesn

gr8qqesn3#

一个简单的聚合就可以完成这项工作:

select [User], format([DateTime], 'ddMMyyyy') AS DT 
from  table_name
group by [User], format([DateTime], 'ddMMyyyy')
having count(*) = 1

相关问题