Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SET DATEFORMAT в функции  [new]
Александр 200230
Member

Откуда:
Сообщений: 119
Hi All!

Написал я такую функцию:

ALTER FUNCTION dbo.EncodeDate
(
@Year INT, @Month INT, @Day INT
)
RETURNS DateTime
AS
BEGIN
RETURN LTrim(str(@Day))+'.'+LTrim(str(@Month))+'.'+LTrim(Str(@Year))
END

Но вот беда: если вызываю из-под MS-Access (adp), то нормально. Если из-под Query Analyzer - ругается (надо @Day и @Month менять местами). А сделать, говорит, set dateformat в функции нельзя.

Что такого можно сделать в функции (или как ее переписать по-другому), чтобы ей было безразлично, кто ее вызвал и какой в этот момент был DATEFORMAT?
29 сен 04, 17:01    [997325]     Ответить | Цитировать Сообщить модератору
 Re: SET DATEFORMAT в функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
ALTER FUNCTION dbo.EncodeDate
(
@Year INT, @Month INT, @Day INT
)
RETURNS DateTime
AS
BEGIN
declare @x char(8), @ret_value datetime
set @x = right('0000'+cast(@Year as varchar(4)), 4) + right('00'+cast(@Month as varchar(2)), 2) + right('00'+cast(@Day as varchar(2)), 2)
If IsDate(@x) set @ret_value = @x
RETURN @ret_value
END
29 сен 04, 17:18    [997434]     Ответить | Цитировать Сообщить модератору
 Re: SET DATEFORMAT в функции  [new]
Александр 200230
Member

Откуда:
Сообщений: 119
Спасибо, все работает. В принципе, мне хватило

RETURN right('0000'+cast(@Year as varchar(4)), 4) + right('00'+cast(@Month as varchar(2)), 2) + right('00'+cast(@Day as varchar(2)), 2)

т.к. сами значения параметров у меня многократно проверяются ранее.

И эта идея с добиванием нулей спереди при помощи right() мне тоже понравилась (в TSQL я новичок) - еще раз благодарю. Вопрос закрыт.
29 сен 04, 17:33    [997537]     Ответить | Цитировать Сообщить модератору
 Re: SET DATEFORMAT в функции  [new]
BugsBunny
Member

Откуда: GMT+5=EST
Сообщений: 2414
How about this
ALTER FUNCTION dbo.DateSerial (@Year INT, @Month INT, @Day INT)
RETURNS DateTime
AS
BEGIN
RETURN DATEADD(day,@day-day(0),DATEADD(month,@month-month(0),DATEADD(year,@year-year(0),0)))
END
As name imply it should work identically to DateSerial from MS Access with all fancy stuff like
...
WHERE [DATE_ONLY] BETWEEN dbo.DateSerial(@year,@month,1) AND dbo.DateSerial(@year,@month+1,1-1)
Wrote couple minutes ago, so no warranty :)
Apologize in advance for breaking someone's ©, ®, ™ or just inventing a bike from FAQ (happened already)
29 сен 04, 22:25    [998101]     Ответить | Цитировать Сообщить модератору
 Re: SET DATEFORMAT в функции  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
RETURN convert(datetime, LTrim(str(@Day))+'.'+LTrim(str(@Month))+'.'+LTrim(Str(@Year)), 104)
для полноты картины

для спящего время бодрствования равносильно сну
29 сен 04, 22:30    [998110]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить