这是我的脚本
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并获得之前的结果呢?
答案 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优先级。
当数据类型不同时,将根据结果确定结果数据类型 数据类型优先的规则。
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)受影响)