Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 помогите разобраться с датой в MS SQL2000  [new]
Atsha
Member

Откуда:
Сообщений: 49
Не получается правильно сконвертировать дату, такое ощущение, что строки, где надо выполнять конвертацию, просто пропускаются. Использую процедуру:
CREATE PROCEDURE Appeal_error
    @StartDt   datetime = NULL,
    @EndDt    datetime = NULL
AS
    IF @StartDt IS NULL
        SELECT @StartDt = convert(datetime,convert(varchar(4),DatePart(year, getdate())))
    IF @EndDt IS NULL
        SELECT @EndDt = GETDATE()
    SELECT
  		VA.AppealIndex, AP.Reason6, AP.Reason5, AP.Reason7, AP.Reason8, AP.Status, VA.TaskEndDt 
FROM VAppeal_Task AS VA RIGHT OUTER JOIN Appeal_President AS AP ON AP.DocId = VA.DocId 
WHERE ((VA.TaskEndDt >= @StartDt) AND (VA.TaskEndDt < @EndDt) AND (AP.Reason6=1 AND AP.Reason5=0))
		OR ((VA.TaskEndDt >= @StartDt) AND (VA.TaskEndDt < @EndDt) AND (AP.Status=0))
		OR ((VA.TaskEndDt >= @StartDt) AND (VA.TaskEndDt < @EndDt) AND (AP.Reason5=0 AND AP.Reason7=0 AND AP.Reason8=0)) 
		OR ((VA.TaskEndDt >= @StartDt) AND (VA.TaskEndDt < @EndDt) AND (AP.Reason7=1 AND AP.Reason8=1)) 
		OR ((VA.TaskEndDt >= @StartDt) AND (VA.TaskEndDt < @EndDt) AND (AP.Reason5=1 AND AP.Reason8=1)) 
		OR ((VA.TaskEndDt >= @StartDt) AND (VA.TaskEndDt < @EndDt) AND (AP.Reason5=1 AND AP.Reason7=1)) 
    RETURN @@ERROR
GO


и обращаюсь к ней следующим образом:
SQLStmt = "SET NOCOUNT ON DECLARE @StartDate datetime, @EndDate datetime "
SQLStmt = SQLStmt & "SELECT @StartDate = convert(datetime, '" & strStartDate & "', 104), @EndDate = convert(datetime, '" & strEndDate & "', 104) "
SQLStmt = SQLStmt & "exec Appeal_error @StartDate, @EndDate" 

т.е. запрос имеет вид:
SET NOCOUNT ON DECLARE @StartDate datetime, @EndDate datetime SELECT @StartDate = convert(datetime, '01.01.2012', 104), @EndDate = convert(datetime, '24.10.2012', 104) exec Appeal_error @StartDate, @EndDate 


а на выходе получаю вот такую ошибку:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.


причем брал код из 100% рабочего отчета, но и это ситуацию не изменило. Как победить эту проблему??
24 окт 12, 07:41    [13366159]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с датой в MS SQL2000  [new]
предположение
Guest
Atsha
т.е. запрос имеет вид:

это поймано профайлером или предположение? в Vb коде способ конвертации не указан.
24 окт 12, 09:06    [13366379]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с датой в MS SQL2000  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Atsha,

1. передавайте дату в виде 'YYYYMMDD'
2. Зачем RIGHT JOIN, если в WHERE накладываются условия на VA, не учитывающие VA.TaskEndDt IS NULL?
24 окт 12, 09:20    [13366432]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с датой в MS SQL2000  [new]
Glory
Member

Откуда:
Сообщений: 104751
А поле VA.TaskEndDt наверное символьное, хоть и хранит дату ?
24 окт 12, 10:23    [13366883]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с датой в MS SQL2000  [new]
Atsha
Member

Откуда:
Сообщений: 49
предположение
Atsha
т.е. запрос имеет вид:

это поймано профайлером или предположение? в Vb коде способ конвертации не указан.

поймано ч\з response.write SQLStmt
что вы имеете ввиду под "в Vb коде способ конвертации не указан" ?
24 окт 12, 12:24    [13367740]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с датой в MS SQL2000  [new]
Atsha
Member

Откуда:
Сообщений: 49
iap
Atsha,

1. передавайте дату в виде 'YYYYMMDD'
2. Зачем RIGHT JOIN, если в WHERE накладываются условия на VA, не учитывающие VA.TaskEndDt IS NULL?


1. на сколько я понимаю дата как раз и преобразовывается в вид YYYYMMDD командой convert
2. VA.TaskEndDt не может быть IS NULL, в данном представлении нулевая дата является максимальной, т.е. равна 9999-12-12
24 окт 12, 12:28    [13367762]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с датой в MS SQL2000  [new]
Atsha
Member

Откуда:
Сообщений: 49
Glory
А поле VA.TaskEndDt наверное символьное, хоть и хранит дату ?


в самом представлении(вьюшке) данное поле содержится в виде DD.MM.YYYY, а получается оно из таблиц где имеет тип данных DateTime
24 окт 12, 12:36    [13367813]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с датой в MS SQL2000  [new]
Glory
Member

Откуда:
Сообщений: 104751
Atsha
в самом представлении(вьюшке) данное поле содержится в виде DD.MM.YYYY, а получается оно из таблиц где имеет тип данных DateTime

И каким же способом оно получается ?
24 окт 12, 13:50    [13368404]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с датой в MS SQL2000  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Atsha
iap
Atsha,

1. передавайте дату в виде 'YYYYMMDD'
2. Зачем RIGHT JOIN, если в WHERE накладываются условия на VA, не учитывающие VA.TaskEndDt IS NULL?


1. на сколько я понимаю дата как раз и преобразовывается в вид YYYYMMDD командой convert
2. VA.TaskEndDt не может быть IS NULL, в данном представлении нулевая дата является максимальной, т.е. равна 9999-12-12
Может. Из-за RIGHT JOIN (см. литературу про джойны). Но с помощью WHERE все эти записи выбрасываются.
Так зачем же тогда RIGHT JOIN вместо INNER JOIN?
24 окт 12, 13:55    [13368457]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с датой в MS SQL2000  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
"Параметры? Не, не слышал."
24 окт 12, 13:58    [13368480]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с датой в MS SQL2000  [new]
Atsha
Member

Откуда:
Сообщений: 49
Glory
Atsha
в самом представлении(вьюшке) данное поле содержится в виде DD.MM.YYYY, а получается оно из таблиц где имеет тип данных DateTime

И каким же способом оно получается ?

хм...соединением таблиц...
24 окт 12, 14:20    [13368683]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с датой в MS SQL2000  [new]
Atsha
Member

Откуда:
Сообщений: 49
iap
Atsha
пропущено...


1. на сколько я понимаю дата как раз и преобразовывается в вид YYYYMMDD командой convert
2. VA.TaskEndDt не может быть IS NULL, в данном представлении нулевая дата является максимальной, т.е. равна 9999-12-12
Может. Из-за RIGHT JOIN (см. литературу про джойны). Но с помощью WHERE все эти записи выбрасываются.
Так зачем же тогда RIGHT JOIN вместо INNER JOIN?


ммм...нет тут важно получить все записи из правой таблицы, иннер джоин тут не поможет. при желании можно поменять таблицы местами и использовать LEFT JOIN, но ситуацию это не изменит
24 окт 12, 14:22    [13368693]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с датой в MS SQL2000  [new]
Atsha
Member

Откуда:
Сообщений: 49
Гавриленко Сергей Алексеевич
"Параметры? Не, не слышал."

вы намекаете, что передача параметров осуществляется не верно? Можете указать на ошибку?
exec Appeal_error @StartDate, @EndDate
24 окт 12, 14:24    [13368704]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с датой в MS SQL2000  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Atsha
iap
пропущено...
Может. Из-за RIGHT JOIN (см. литературу про джойны). Но с помощью WHERE все эти записи выбрасываются.
Так зачем же тогда RIGHT JOIN вместо INNER JOIN?


ммм...нет тут важно получить все записи из правой таблицы, иннер джоин тут не поможет. при желании можно поменять таблицы местами и использовать LEFT JOIN, но ситуацию это не изменит
Тогда WHERE неправильно написан.
Потому что в SELECTе из первого поста написан INNER JOIN, а не RIGHT JOIN на самом деле.
Совет стандартен и повторялся тысячи раз - все условия из WHERE надо перенести в ON
24 окт 12, 14:26    [13368721]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с датой в MS SQL2000  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Atsha
Гавриленко Сергей Алексеевич
"Параметры? Не, не слышал."

вы намекаете, что передача параметров осуществляется не верно? Можете указать на ошибку?
exec Appeal_error @StartDate, @EndDate
Имелись в виду параметры на клиенте, как я думаю.
24 окт 12, 14:27    [13368728]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с датой в MS SQL2000  [new]
aWlad
Member

Откуда: Москва
Сообщений: 42
Atsha,

В MS SQL конвертация типа VARCHAR в тип DATETIME не гарантируется: дата хранится в бинарном виде всегда, она только преобразуется к требуемому виду при выводе. Гарантируйте для этой конвертации хотя бы строку 'YYYY-MM-DD'.
Вид строки '24.10.2012' всегда вызовет ошибку.
24 окт 12, 23:49    [13371768]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с датой в MS SQL2000  [new]
Atsha
Member

Откуда:
Сообщений: 49
iap,
можно посмотреть текст процедуры в первом сообщении, она настроена на прием именно этих параметров.
25 окт 12, 06:58    [13372005]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с датой в MS SQL2000  [new]
Atsha
Member

Откуда:
Сообщений: 49
iap
Atsha
пропущено...


ммм...нет тут важно получить все записи из правой таблицы, иннер джоин тут не поможет. при желании можно поменять таблицы местами и использовать LEFT JOIN, но ситуацию это не изменит
Тогда WHERE неправильно написан.
Потому что в SELECTе из первого поста написан INNER JOIN, а не RIGHT JOIN на самом деле.
Совет стандартен и повторялся тысячи раз - все условия из WHERE надо перенести в ON

хм...а будут ли условия отрабатывать корректно в ON? И почему тогда данный запрос отлично работает в MS Query и в SQL Query Analyzer'e ??
25 окт 12, 07:18    [13372017]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с датой в MS SQL2000  [new]
Atsha
Member

Откуда:
Сообщений: 49
aWlad
Atsha,

В MS SQL конвертация типа VARCHAR в тип DATETIME не гарантируется: дата хранится в бинарном виде всегда, она только преобразуется к требуемому виду при выводе. Гарантируйте для этой конвертации хотя бы строку 'YYYY-MM-DD'.
Вид строки '24.10.2012' всегда вызовет ошибку.


Если я правильно понял вы предлагаете переписать представление VAppeal_Task чтобы дата была там в виде YYYY-MM-DD ??
25 окт 12, 07:22    [13372020]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с датой в MS SQL2000  [new]
Atsha
Member

Откуда:
Сообщений: 49
iap
Atsha
пропущено...


ммм...нет тут важно получить все записи из правой таблицы, иннер джоин тут не поможет. при желании можно поменять таблицы местами и использовать LEFT JOIN, но ситуацию это не изменит
Тогда WHERE неправильно написан.
Потому что в SELECTе из первого поста написан INNER JOIN, а не RIGHT JOIN на самом деле.
Совет стандартен и повторялся тысячи раз - все условия из WHERE надо перенести в ON

Переписал как вы предлагаете:
CREATE PROCEDURE Appeal_error
    @StartDt   datetime = NULL,
    @EndDt    datetime = NULL
AS
    IF @StartDt IS NULL
        SELECT @StartDt = convert(datetime,convert(varchar(4),DatePart(year, getdate())))
    IF @EndDt IS NULL
        SELECT @EndDt = GETDATE()
    SELECT  VA.AppealIndex, AP.Reason6, AP.Reason5, AP.Reason7, AP.Reason8, AP.Status, VA.TaskEndDt 
    FROM Appeal_President AS AP LEFT OUTER JOIN VAppeal_Task AS VA ON AP.DocId = VA.DocId 
    AND (((VA.TaskEndDt >= @StartDt) AND (VA.TaskEndDt < @EndDt) AND (AP.Reason6=1 AND AP.Reason5=0))
	OR ((VA.TaskEndDt >= @StartDt) AND (VA.TaskEndDt < @EndDt) AND (AP.Status=0))
	OR ((VA.TaskEndDt >= @StartDt) AND (VA.TaskEndDt < @EndDt) AND (AP.Reason5=0 AND AP.Reason7=0 AND AP.Reason8=0)) 
	OR ((VA.TaskEndDt >= @StartDt) AND (VA.TaskEndDt < @EndDt) AND (AP.Reason7=1 AND AP.Reason8=1)) 
	OR ((VA.TaskEndDt >= @StartDt) AND (VA.TaskEndDt < @EndDt) AND (AP.Reason5=1 AND AP.Reason8=1)) 
	OR ((VA.TaskEndDt >= @StartDt) AND (VA.TaskEndDt < @EndDt) AND (AP.Reason5=1 AND AP.Reason7=1)) )
    
    RETURN @@ERROR
GO

получил на выходе ошибку:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.
25 окт 12, 07:45    [13372051]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с датой в MS SQL2000  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Atsha,

панимаеш - тебе сказали совершено обратное,но тебе даже лень прочитать все что тебе написали :((
Про параметры - было ,так ето про свойства АДО или NET или через чего еще ты там вызываеш просиду ,но те влом быоо хелп почитать даже :( там у команда есть парметры в которые и нужно пыжевать все при вызову хранимки сраху с правильным типом данных

Просиду мож хоть 5 раз перписывть - у тя там датетай с датетайм сравниваться там все ОК ,а вот с клиента ты хрень пихаеш - те ето уже 10 раз написали ,но те пох - ты не читатель :((

но ТЕ даже лень подумать -решение твоих гроаблей те уже 3 раза здесь написали -

блин ну и молодеж пошла
25 окт 12, 08:01    [13372064]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с датой в MS SQL2000  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
Atsha
и обращаюсь к ней следующим образом:
SQLStmt = "SET NOCOUNT ON DECLARE @StartDate datetime, @EndDate datetime "
SQLStmt = SQLStmt & "SELECT @StartDate = convert(datetime, '" & strStartDate & "', 104), @EndDate = convert(datetime, '" & strEndDate & "', 104) "
SQLStmt = SQLStmt & "exec Appeal_error @StartDate, @EndDate" 

т.е. запрос имеет вид:
SET NOCOUNT ON DECLARE @StartDate datetime, @EndDate datetime SELECT @StartDate = convert(datetime, '01.01.2012', 104), @EndDate = convert(datetime, '24.10.2012', 104) exec Appeal_error @StartDate, @EndDate 



вот чтобы точно быть уверенным, что Вы отсылаете на сервер имеено то, что думаете и проверьте строку запроса SQLStmt
после её формирования на клиенте
25 окт 12, 08:19    [13372090]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с датой в MS SQL2000  [new]
AxuliON
Member

Откуда: оттуда, и на лыжах
Сообщений: 574
Atsha,

Преобразование даты в строку вообще ЗЛО!
Тут уже сказали, что использовать параметры при вызове надо?
Или опять "не слышал"?
25 окт 12, 10:30    [13372612]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с датой в MS SQL2000  [new]
Atsha
Member

Откуда:
Сообщений: 49
AxuliON
Atsha,

Преобразование даты в строку вообще ЗЛО!
Тут уже сказали, что использовать параметры при вызове надо?
Или опять "не слышал"?

1. на сколько я знаю ms sql работает с датой как со строкой, если можете - предложите свой вариант обработки даты
2. вообще то процедура вызывается с параметрами:
EXEC ИМЯ_ПРОЦЕДУРЫ ПАРАМЕТР1, ПАРАМЕТР2
в качестве параметров у меня дата начала и дата конца
25 окт 12, 10:54    [13372771]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с датой в MS SQL2000  [new]
Glory
Member

Откуда:
Сообщений: 104751
Atsha
Glory
пропущено...

И каким же способом оно получается ?

хм...соединением таблиц...

Соединением таблиц поле получить нельзя.
Поле получается путем указания выражения в select
Но наверное ваш select настолько секретный, что просто глупо просить его опубликовать

просто exec Appeal_error работает или нет ?
25 окт 12, 10:59    [13372810]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить