带联合的T-SQL选择脚本

时间:2011-12-10 13:34:15

标签: sql sql-server-2008 tsql

这是我的脚本

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

但是当我结合这两个脚本时,结果是不同的:

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会尝试修复raw中的字符数,那么如何使用union并获得之前的结果呢?

3 个答案:

答案 0 :(得分:2)

请改为尝试:

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时,它们会正确显示(我希望!)

答案 1 :(得分:2)

看起来变量@Mydate属于DateTime类型,而DateTime优先级高于Date优先级。

T-SQL UNION (MSDN)

  

当数据类型不同时,将根据结果确定结果数据类型   数据类型优先的规则。

Data Type Precedence (Transact-SQL)

  

当一个运算符组合了两个不同数据类型的表达式时,   数据类型优先级的规则指定具有的数据类型   较低的优先级转换为具有较高的数据类型   优先级。

答案 2 :(得分:0)

在联盟中,每列有一种类型。

Convert(varchar,@Mydate,101) [Date]正在与一个日期时间(@Mydate)的列联合,因此它会自动转换或转换为日期时间。

所以问问自己这个。

2011-12-10 16:32:00.800和12/10/2011如何进入同一类型?

答案:make the first a varchar too but in the long dateime format using 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行(s)受影响)