2015-02-06 5 views
-1

У меня есть запрос:TSQL - Добавление текста к DateTime в SELECT, создает нежелательный порядок операций

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).

ответ

1

Вы падаете фол Data Type Precedence при выполнении конкатенации. Вам необходимо, чтобы первая часть вашей формулы использовалась в 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 
2

в запросе вы добавляете два Int значение

изменить его строку CONCAT литья значения 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 
0

Если вы используете производную таблицу (вложенную 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