Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > (MS SQL) CHAR+INT=DATETIME


Автор: Liska 31.10.2004, 14:14
Привет
помогите, плиз....
Дан некоторый фрагмент SQL-кода:
DECLARE @a CHAR(12)
DECLARE @b DATETIME
DECLARE @c INT
SET @a=’12.2.04’
SET @c=6

Какой правильный оператор для вычисления новой даты:
SET @b=@a+@c
SET @b=@a+CAST(@c AS DATETIME)
SET @b=CAST(@a AS DATETIME) +@c
SET @b=CAST((CAST(@a AS INT)+@c) AS DATETIME)


Как вообще разобраться с датой и временем? Если к переменной типа DATETIME прибавить переменную типа INT, то он ее куда прибавит, к числу, к месяцу или к году? или вообще надо конвертировать все в дату, а потом прибавлять?? Разьясните, плиз!!! :qstn

Автор: boevik 31.10.2004, 15:57
Liska, лучше использовать DATEADD. Или это вопрос из теста и надо выбрать ответ?

Если запустить этот примерчик, то второй и третий вариант дают ответ '8 Dec 2004'.
Первый и четвертый не работают.

Автор: Lunatikus 5.9.2007, 10:37
Привет.А как прибавить к дате месяц с помощью запроса?
Код

...WHERE data=data1+1

прибавляет день.

база MS SQL 2000.

Автор: ТоляМБА 5.9.2007, 10:44
Цитата
Для добавления дней к дате можно использовать «День года» («y»), «День» («d») или «День недели» («w»).
Функция DateAdd не возвращает недопустимые значения дат. В приведенном ниже примере показано добавление одного месяца к дате «31 января».
DateAdd("m", 1, "31-Jan-95")
В данном случае функция DateAdd вернет дату «28-Feb-95», а не «31-Feb-95». Если исходная дата — «31-Jan-96», то функция вернет «29-Feb-96», так как 1996 год является високосным.

Автор: Lunatikus 5.9.2007, 11:05
угу,работает.Но только если сравнивать ,Как
Код

WHERE data=DATEAD(month,1,data1)

а вот если я захочу сделать
Код

WHERE data IN (DATEAD(month,1,data1),DATEAD(month,2,data1))

он покажет мне большую фигу в виде синтаксической ошибки.
А зачем мне нужен IN?
Вот простенькая задачка:
в таблице одно поле data-даты.Другое интовое num-допустим,показывает число месяцев после указанной даты.
---01.01.2007------1---
---06.02.2007------2---
так вот как вывести такую таблицу:
---01.01.2007---
---06.02.2007---
---06.03.2007---
как видно,нужно "сделать" новые даты на основе кол-ва месяцев.Если оно 1,то дата единственная.

Автор: Lunatikus 5.9.2007, 11:23
дошел до того что надо делать так:
Код

...WHERE data=data1 OR data=DATEADD(month,num-1,data1) 


таким образом,елси число месяцев-1,то будет выполняться условие только на одну дату(второе условие будет равно первому)
Если число-2.То тоже все нормально.Берется первая дата,а второе условие берет дату на месяц позже ,Как и задумано.А вот как сделать при num>2?Есть какие-нибудь мысли?

эх...было бы здорово,если бы можно было добавлять в запрос условные переходы...тогда все решалось бы легко

Автор: Lunatikus 6.9.2007, 14:02
в общем,решил проблему,ограничив число месячев num до 12. в итоге сделал двенадцать идентичных улсовий:
Код

WHERE data=data1 OR (data=DATEADD(month,num-1,data1)) OR (data=DATEADD(month,num-2,data1) AND num-2>=0) OR (data=DATEADD(month,num-3,data1) AND num-3>=0) ...

Автор: Lunatikus 7.9.2007, 09:35
схожая прабла,потому не стал новую тему делать.
Пытаюсь перенести данные из одной таблицы в другую.В таблице,куда переношу данные поля data(datetime) и por(float).В таблице-источнике эти поля варчаровые.Подскажите,как в запросе сделать конверт правильно?То,Что у меня-не работает-выдает ошибку конвертации:
Код

INSERT INTO T1(data,por) SELECT data,por FROM T2

Автор: ТоляМБА 7.9.2007, 09:55
CAST, CONVERT - читаем синтаксис

На какое поле ругается то? И текст запроса и значения пары полей - в студию!
Может у тебя в данных есть пустые или Null значения?

Автор: Lunatikus 7.9.2007, 10:00
дату переводит конвертом,а вот с флотом праблы.ни каст ни конверт не помогает:
Код

CONVERT (float,por),CAST(por as float)

ругается что не может привести варчар к флоту

Автор: ТоляМБА 7.9.2007, 10:17
Хм... на этой тачке щаз нет MS-SQL, но ты в BOL (F1) глянь хэлп по каст или в конверт - точно помню в одном из них была таблица возможности перевода из одного типа в другой!  smile 

Автор: Lunatikus 7.9.2007, 10:33
я нашел,в чем прабла.Он выдает ошибку,Как только доходит до ненулевого значения поля варчар por.И видит 0,211423325535.Его смущает запятая.Потому что елси поставить точку в варчаровской строке,то переводит спокойно.Вопрос:как везде,где стоит запятая в этом поле поменять на точку?вручную зело долго

Автор: kobra 11.9.2007, 13:03
Код

CONVERT (float,REPLACE(por, ',', '.'))

Автор: Lunatikus 11.9.2007, 13:16
гениально!!!! smile  smile  smile спасибо =) жаль раньше не узнал,сейчас уже базу переделал даже,везде где должен быть float стоят точки как разделители))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)