SQL - 将文本附加到 SELECT 中的日期时间会产生不需要的操作顺序

TSQL - Appending text to a datetime in the SELECT gives unwanted order of operations

我有一个问题:

SELECT TOP 3 
    Person.Name AS PersonName,
    YEAR(Person.DateBorn)/100 AS JustCenturyNumbers,
    Person.PersonNumber AS RestOfDateTimeNumbers,
    YEAR(Person.DateBorn)/100+Person.PersonNummer AS CompleteDateTimeNumber
FROM Person 

我想要的是将 RestOfDateTimeNumbers 附加到 JustCenturyNumbers 并获得完整的日期时间数字表示形式,例如:

PersonName  JustCenturyNumbers  RestOfDateTimeNumbers   CompleteDateTimeNumber
Tim         20                  0003167012              200003160000                
Fred        19                  0009272725              190009270000                
Jenny       19                  0106207228              190106200000      

但我得到的是:

PersonName  JustCenturyNumbers  RestOfDateTimeNumbers   CompleteDateTimeNumber
Tim         20                  0003167012              3167032
Fred        19                  0009272725              9272744
Jenny       19                  0106207228              106207247

我猜 /100 函数以某种方式应用于字符串的其余部分而不是单独的日期,但我一直无法解决它,因为我是 TSQL 的新手-功能。

知道如何解决这个问题并获得我想要的结果吗?

我使用 TSQL 和 SQL-Server 2008 (rt)。

在您的查询中您添加了两个 int 值

通过将值转换为 varchar 将其更改为字符串连接

SELECT TOP 3 
    Person.Name AS PersonName,
    YEAR(Person.DateBorn)/100 AS JustCenturyNumbers,
    Person.PersonNumber AS RestOfDateTimeNumbers,
    cast(YEAR(Person.DateBorn)/100 as varchar(2))+cast(Person.PersonNummer as varchar(16)) AS CompleteDateTimeNumber
FROM Person 

如果你使用派生的table(嵌套SELECT),那真的很简单。

SELECT 
t.*, 
cast( JustCenturyNumbers as varchar(50) ) + 
cast( RestOfDateTimeNumbers as varchar(50) )  
as CompleteDateTimeNumber
FROM 
(
    SELECT TOP 3 
    Person.Name AS PersonName,
    YEAR(Person.DateBorn)/100 AS JustCenturyNumbers,
    Person.PersonNumber AS RestOfDateTimeNumbers,
    FROM Person 
) t

如果您希望将最终结果视为文本而不是数字,那么您就违反了 Data Type Precedence when doing the concatenation. You need to CAST 将公式的第一部分转换为 varchar 的做法:

SELECT TOP 3 
    Person.Name AS PersonName,
    YEAR(Person.DateBorn)/100 AS JustCenturyNumbers,
    Person.PersonNumber AS RestOfDateTimeNumbers,
    CAST(YEAR(Person.DateBorn)/100 AS varchar(2)) +Person.PersonNumber AS CompleteDateTimeNumber
FROM Person