SQL Server getdate()返回奇怪的结果?

时间:2014-04-01 13:38:02

标签: sql sql-server

所以我有一个小问题:

GO
declare @datetime varchar(25);
select @datetime = getdate();
select cast(convert(varchar(8), @datetime, 112) as varchar)
GO

返回此:4月1日2

但是这个:

GO
declare @datetime varchar(25);
select @datetime = getdate();
select cast(convert(varchar(8), getdate(), 112) as varchar)
GO

返回:20140401

(这就是我们想要的),那么为什么要宣布搞乱呢?以及如何获得第二次返回的结果? (这是在Trigger btw中,但这是混乱的部分)

6 个答案:

答案 0 :(得分:5)

尝试使用此更改的第一个:

GO
declare @datetime DATETIME;
select @datetime = getdate();
select cast(convert(varchar(8), @datetime, 112) as varchar)
GO

问题是由varchar数据类型和您使用的错误强制转换产生的,方法是将GETDATE()的结果选择到varchar中。

答案 1 :(得分:2)

您需要将@datetime的数据类型更改为DATETIME

declare @datetime DATETIME;
select @datetime = getdate();
select cast(convert(varchar(8), @datetime, 112) as varchar)

来自varchar to datatime的隐式转换发生在select @datetime = getdate();,导致了奇怪的行为

答案 2 :(得分:1)

在这种情况下:

declare @datetime varchar(25);
select @datetime = getdate();
select cast(convert(varchar(8), @datetime, 112) as varchar)

@datetimeVARCHAR值,其中包含"Apr 1 2014 ...."。当你CONVERTVARCHAR(8)时,所有发生的事情都被截断为8个字符 - "样式"参数被忽略。

如果您将@datetime广告声明为DATETIME,那么它将保持DATETIME值,而CONVERT会使用您指定的格式将其转换为字符串。

答案 3 :(得分:0)

此行的隐式转换:

select @datetime = getdate();

为什么不将@datetime声明为datetime类型?

答案 4 :(得分:0)

GO
declare @datetime SMALLDATETIME;
select @datetime = getdate();
select cast(convert(varchar(8), @datetime, 112) as varchar)
GO

为什么要将它存储为varchar?将它保留为日期时间,直到你必须将它抛出。

以上代码正确返回。

答案 5 :(得分:0)

您已将其分配给varchar变量。您也可以直接使用

select cast(convert(varchar(8), getdate(), 112) as varchar)