剥离SQL Server 2005的日期时间

时间:2013-04-08 04:18:24

标签: function sql-server-2005 stored-procedures

我想我在这里疯了。

我正在尝试在SQL Server 2005上执行一个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

当我在SP之外运行上述功能时,我的日期就好了。当我通过SP运行它时会返回2012-12-30 00:00:00.000

变量@CalcDate声明为varchar(10)

有什么想法吗?

提前致谢

修改

到目前为止,这是SP的正文:

declare @StartDate [datetime]
,   @EndDate [Datetime]
,   @CalcDate [datetime] --This number will change in the WHILE loop to reflect the increment of days
,   @Week [varchar]
,   @Period [varchar]
,   @i [int]
,   @Year [int]
,   @CalcDay [int]
,   @CalcMonth [int]
,   @CalcYear [int]
,   @ConcatDate [char] (10)

set @StartDate = '2012-12-30'
set @EndDate = '2013-01-28'
set @Year = 2013
set @i = -1

-- Going to do a while loop here and instead of Week number and Period Number I'm going to do some calculations
set @Week = (Select WeekNum from aaGreensPeriodListTest Where PeriodNum = 1 and WeekNum = 1)
set @Period = (Select PeriodNum from aaGreensPeriodListTest Where PeriodNum = 1 and WeekNum = 1)
set @CalcDate = @StartDate + @i

set @CalcMonth = datepart(mm,@calcdate)

insert into aaGreensPeriodTest(RealDate,GreensYear,GreensPeriod,GreensWeek)
values (@CalcDate,@Year,@Period,@Week)

select @CalcDate as CalcDate, @CalcMonth as CalcMonth

2 个答案:

答案 0 :(得分:1)

SQL Server 2005不支持没有时间部分的日期类型。 如果您需要将日期作为字符串,则可以使用convert函数。例如:

declare @date datetime;
set @date = getdate();
select convert(varchar, @date, 101) -- that will return date in ‘mm/dd/yyyy’ format

如果您需要一个没有时间部分的日期时间变量进行某些计算,您可以使用下面的表达式:

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

答案 1 :(得分:0)

根据http://msdn.microsoft.com/en-ca/library/ms187928.aspx,您无法直接投放float-&gt;日期。它根本不受支持。但是您可以投射日期时间 - >日期,因此您必须进行双重投射。或者举个例子,三重演员:

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