Сценарий выбора T-SQL с объединением - PullRequest
3 голосов
/ 10 декабря 2011

это мои сценарии

Select @Mydate [Date], 'Normal DateTime' [Describe]
Select Convert(varchar,@Mydate,101) [Date],'Format 101' [Describe]

и результат:

  Date                            Describe
  2011-12-10 16:32:00.800         Normal DateTime

  Date                            Describe
  12/10/2011                      Format 101

но когда я объединяю эти 2 скрипта, результат будет другим:

Select @Mydate [Date], 'Normal DateTime' [Describe]
Union
Select Convert(varchar,@Mydate,101) [Date],'Format 101' [Describe]


  Date                            Describe
  2011-12-10 16:32:00.800         Normal DateTime
  2011-12-10 00:00:00.000         Format 101

Я думаю, что SQL пытается исправить количество символов в обоих форматах, так как я могу использовать объединение и получить предыдущие результаты?

Ответы [ 3 ]

2 голосов
/ 10 декабря 2011

Попробуйте вместо этого:

Select CONVERT(VARCHAR(50), @Mydate, 121) [Date], 'Normal DateTime' [Describe]
Union
Select CONVERT(VARCHAR, @Mydate, 101) [Date],'Format 101' [Describe]

Дает мне вывод:

Date                      Describe
2011-12-10 16:32:00.000   Normal DateTime
12/10/2011                Format 101

Когда вы явно приведете оба значения к VARCHAR, они будут отображаться правильно (янадеюсь!)

2 голосов
/ 10 декабря 2011

Похоже, переменная @Mydate имеет тип DateTime, а приоритет DateTime выше, чем приоритет Date.

T-SQL UNION (MSDN) :

Когда типы данных различаются, результирующий тип данных определяется на основе правила для приоритета типа данных.

Приоритет типа данных (Transact-SQL)

Когда оператор объединяет два выражения разных типов данных, правила для приоритета типа данных указывают, что тип данных с более низкий приоритет преобразуется в тип данных с более высоким старшинство.

0 голосов
/ 10 декабря 2011

В союзе у вас есть один тип на столбец.

Convert(varchar,@Mydate,101) [Date] объединяется со столбцом даты-времени (@Mydate), поэтому он автоматически приводится или преобразуется в дату-время.

Так что спросите себя об этом.

Как 2011-12-10 16: 32: 00.800 и 12.10.2011 идут к одному типу?

Ответ: сделать первый тоже varchar, но в длинном формате даты с использованием Convert (varchar, @myDate, 21)

declare @Mydate datetime
set @Mydate = getdate()

Select Convert(varchar,@Mydate,21) , 'Normal DateTime' [Describe]
Union
Select Convert(varchar,@Mydate,101) [Date],'Format 101' [Describe]


Date                           Describe
------------------------------ ---------------
2011-12-11 02:45:44.660        Normal DateTime
12/11/2011                     Format 101

(затронуто 2 строк)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...