2013-04-08 2 views
0

Думаю, я схожу с ума.Удаление времени из даты и времени SQL Server 2005

Я пытаюсь сделать SP на SQL Server 2005, который принимает дату, просматривает ее в другой таблице и назначает номер периода и номер недели (для целей финансового календаря).

Выход должен содержать дату как строку, а не дату и время.

Я просто НЕ МОЖЕТ получить дату, чтобы показать ее без времени.

Я попробовал несколько способов:

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)

Любые идеи?

Заранее спасибо

EDIT

Вот тело 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 
+0

я не уверен, что вы пытаетесь сделать. Не могли бы вы отправить код - или соответствующую часть - из SP, где вы используете результат? –

+0

@Ic Отредактировано OP, чтобы показать SP в его нынешнем виде. Это все еще очень грубо. –

+1

@AlisonWonderland Начиная чувствовать, что я что-то пропустил, так как не вижу, как вы конвертируете дату, используя функцию в своем SP, но как это значение выводится в SP? Как 'DATETIME' или' VARCHAR'? –

ответ

1

SQL Server 2005 не поддерживает тип даты без временной части. Если вам нужно получить дату в виде строки, вы можете использовать функцию преобразования. Например:

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) 
+0

@Alison Wonderland: Чтобы расширить ответ от Андрея, тип данных 'datetime' не имеет встроенного формата. Как следует из названия, это всегда дата * и * время. Когда вы назначаете строку, отформатированную как дату без временной части, переменной datetime, последняя часть времени автоматически устанавливается в '00: 00'. Как вы видите, что время на выходе зависит от программного обеспечения, которое вы используете для просмотра результатов. Если используемое вами программное обеспечение не может интерпретировать дату '00: 00' datetime как чистую дату, как вам кажется, вам нужно преобразовать значение в строку * непосредственно перед возвратом. –

0

Согласно http://msdn.microsoft.com/en-ca/library/ms187928.aspx, вы не можете бросить float-> дату непосредственно. Это просто не поддерживается. Но вы можете указать дату datetime->, поэтому вам придется делать двойной бросок. Или, например, ваш пример, тройной листинг:

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

Спасибо @Marc B - SQL Server 2005 не поддерживает тип «даты» к сожалению. Должен ли я использовать дату и время там вместо даты? –

+0

, если вы используете datetime, тогда вы получите значения времени. Я думаю, пойдите, бросьте пирог в BillCo, чтобы не поддерживать поля открытой даты ... –

Смежные вопросы