Function 正在剥离过期的日期时间SQL Server 2005

Function 正在剥离过期的日期时间SQL Server 2005,function,sql-server-2005,stored-procedures,Function,Sql Server 2005,Stored Procedures,我想我快疯了 我正在尝试在SQLServer2005上执行一个SP,它获取一个日期,在另一个表中查找,并分配一个期间号和周号(用于财务日历) 输出需要将日期保存为字符串,而不是日期时间 如果没有时间,我根本无法显示日期 我尝试了几种方法: select cast(floor(cast(@CalcDate as float)) as datetime) 我制作了一个函数,将其转换为字符串并再次将其放回: CREATE FUNCTION dbo.DateToVarchar (@DateIn dat

我想我快疯了

我正在尝试在SQLServer2005上执行一个SP,它获取一个日期,在另一个表中查找,并分配一个期间号和周号(用于财务日历)

输出需要将日期保存为字符串,而不是日期时间

如果没有时间,我根本无法显示日期

我尝试了几种方法:

select cast(floor(cast(@CalcDate as float)) as datetime)
我制作了一个函数,将其转换为字符串并再次将其放回:

CREATE FUNCTION dbo.DateToVarchar (@DateIn datetime)
RETURNS varchar(10)
AS
BEGIN
declare @DD [varchar] (2)
declare @MM [varchar] (2)
declare @YYYY [varchar] (4)
declare @DateOut [varchar] (10)
declare @DDLen [int]
declare @MMLen [int]

set @DD = datepart(dd,@DateIn)
set @DDLen = len(@DD)
set @DD = (case when @DDLen < 2 then '0' + @DD else @DD end)

set @MM = datepart(mm,@DateIn)
set @MMLen = len(@MM)
set @MM = (case when @MMLen < 2 then '0' + @MM else @MM end)

set @YYYY = datepart(yyyy,@DateIn)

set @DateOut = @YYYY + '-' + @MM + '-' + @DD

return @DateOut

END
根据,您不能直接施放float->date。这根本不是支持。但是你可以使用datetime->date,所以你必须加倍使用。或者给出您的示例,三重播放:

CAST(CAST(CAST(@CalcDate AS float) AS datetime) AS date)

SQL Server 2005不支持没有时间部分的日期类型。 如果需要以字符串形式获取日期,可以使用convert函数。例如:

declare @date datetime;
set @date = getdate();
select convert(varchar, @date, 101) -- that will return date in ‘mm/dd/yyyy’ format
如果某些计算需要不带时间部分的datetime变量,可以使用以下表达式:

declare @date datetime;
set @date = getdate();
select dateadd(dd, datediff(dd, 0, @date), 0)

感谢@Marc B-SQL Server 2005不支持“日期”类型。我是否应该在其中使用datetime而不是date?如果使用datetime,则将获得时间值。我想去给BillCo扔个馅饼,因为它不支持简单的日期字段……我不知道你想做什么。您能将SP的代码或相关部分发布到使用结果的位置吗?@Ic编辑OP以显示SP的现状。它仍处于非常粗略的草稿中。@AlisonWonderland开始觉得我遗漏了一些东西,因为我看不到您在SP中使用函数转换日期,但是SP上的输出值是如何声明的?作为
DATETIME
VARCHAR
?@JoachimIsaksson-道歉:我从我的SP中取出函数调用,因为它在SP中不工作,只是作为一个独立的。好的-我向所有人道歉:我发现了我的错误。我将@CalcDate声明为datetime,并使用它来定义函数的输出,因此我以。。。。日期时间。真的很抱歉,谢谢大家的帮助。@Alison Wonderland:进一步介绍Andrey的答案,
datetime
数据类型没有固有的格式。顾名思义,它总是日期和时间。将格式为日期但不带时间部分的字符串指定给datetime变量时,后者的时间部分将自动设置为
00:00
。如何在输出中看到datetime取决于用于查看结果的软件。如果您使用的软件无法将
00:00
datetime解释为您想要的纯日期,则需要在返回值之前立即将值转换为字符串。
declare @date datetime;
set @date = getdate();
select dateadd(dd, datediff(dd, 0, @date), 0)