Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Новая версия вопроса / 25 сообщений из 26, страница 1 из 2
22.10.2002, 17:17:05
    #32060843
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
имется таблица

Table(Id int primary key,
...
CnageDT datetime)

поле CnageDT автоматически обновляется getDate()

Хочу реализовать обновление записи только в том случае если она с момента считывания никем не изменена - т.е. в процедуре Update существует условие обновления

WHERE ID=@Id AND CnageDT=@daCnageDT

где @daCnageDT - параметр типа datetime

при считывании записи получаю значение CnageDT = "22-10-2002 15:59:39.327"
при обновлении записи передаю это значение в параметр @daCnageDT и для контроля выдаю это значение назад из процедуры - обновление не происходит т.к. возвращенное значение выглядит так "22-10-2002 15:59:40.000"

Помогите, кто может
...
Рейтинг: 0 / 0
22.10.2002, 17:19:00
    #32060846
vap
vap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
=Хочу реализовать обновление записи только в том случае если она с момента считывания никем не изменена
Используй тип TIMESTAMP
...
Рейтинг: 0 / 0
22.10.2002, 17:20:39
    #32060848
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
но хочется также и иметь представление когда запись была изменена
...
Рейтинг: 0 / 0
22.10.2002, 17:23:26
    #32060850
sergwsk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
Может быть Тип параметра TimeStamp ?
...
Рейтинг: 0 / 0
22.10.2002, 17:25:32
    #32060855
vap
vap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
Используй тригер на обновление.
А вообще нехорошо использовать в WHERE время+милисекунды, это дополнительный элемент нестабильности. Сегодня обновляется, завтра перестанет...
...
Рейтинг: 0 / 0
22.10.2002, 17:28:18
    #32060859
Luchkin Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
imho, когда считываешь запись, то считываешь во временную таблицу, с тем считанным значением и сравнивать надо...
считаем.
Код: plaintext
select * into #tForEdit from Table

что-то меняем.
записываем обратно.
Код: plaintext
1.
2.
3.
update Fld1= t.Fld1, Fld2= t.Fld2, ..., FldN= t.FldN
from #tForEdit t
where (ID = t.ID) and (CnageDT = t.CnageDT)

или около того
...
Рейтинг: 0 / 0
22.10.2002, 17:30:52
    #32060863
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
да я б не использовал бы время+милисекунды дак эта процедура getdate() вставляет их и я уже обязан во WHERE указать оригинальное значение
...
Рейтинг: 0 / 0
22.10.2002, 17:34:45
    #32060864
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
>imho, когда считываешь запись, то считываешь во >временную таблицу, с тем считанным значением и >сравнивать надо...
>считаем.
>select * into #tForEdit from Table

>что-то меняем.
>записываем обратно.
>update Fld1= t.Fld1, Fld2= t.Fld2, ..., FldN= t.FldN
>from #tForEdit t
>where (ID = t.ID) and (CnageDT = t.CnageDT)

>или около того

не подходит - много требует ресурсов, куча пользователей, сессий
...
Рейтинг: 0 / 0
22.10.2002, 17:39:40
    #32060871
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Syntax
DATEDIFF ( datepart , startdate , enddate ) 

Arguments
datepart

Is the parameter that specifies on which part of the date to calculate the difference. The table lists dateparts and abbreviations recognized by Microsoft® SQL Server™.

Datepart Abbreviations 
Year yy, yyyy 
quarter qq, q 
Month mm, m 
dayofyear dy, y 
Day dd, d 
Week wk, ww 
Hour hh 
minute mi, n 
second ss, s 
millisecond ms 

Помоему с датами лучше работать таким образом
...
Рейтинг: 0 / 0
22.10.2002, 17:40:22
    #32060873
timda
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
where
DATEPART(d, field_date) = DATEPART(d, get_date()) and
DATEPART(m, field_date) = DATEPART(m, get_date()) and
DATEPART(y, field_date) = DATEPART(y, get_date())

па маему енто так наждо делать
...
Рейтинг: 0 / 0
22.10.2002, 17:44:35
    #32060880
Luchkin Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
и так по-босяцки можно :)
Код: plaintext
1.
2.
3.
declare @FldDate datetime, @ParDate datetime
set @FldDate=CAST('2002-10-22 15:59:39.327' as datetime)
set @ParDate=CAST('2002-10-22 15:59:40.000' as datetime)
select  0  where @FldDate > (@ParDate-CAST('00:00:01' as datetime)) and @FldDate < (@ParDate+CAST('00:00:01' as datetime))
...
Рейтинг: 0 / 0
22.10.2002, 17:58:38
    #32060892
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
получается что в MSSQL работать с типом DateTime практически невозможно работать - если я буду производить поиск записи созданной именно в заданный момент времени указанной даты - я просто запись не найду или если сделать условие интервалом (что есть криво) - получу кучу записей и уж потом я должен анализировать подходит ли запись близко к запросу или нет.
Обидно - в других базах такого бардака нет - внутреннее представление форматов данных совпадает с внешним т.е. если в поле есть милисекунды - они видны и с ними можно нормально работать
...
Рейтинг: 0 / 0
22.10.2002, 18:05:36
    #32060898
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
22-10-2002 15:59:39.327 и 22-10-2002 15:59:40.000
таки разные даты
...
Рейтинг: 0 / 0
22.10.2002, 18:07:01
    #32060900
Luchkin Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
Погодь! Я не понял что-то... база тут при чём?
ты передаёшь параметр, а когда он доходит до SQL он уже каким-то образом округлён. так? Значит источник неприятностей в механизме передачи параметров, а это, наверное, не база, а делфи+АДО там или ещё какая-нибудь хрень. Как думаешь?
...
Рейтинг: 0 / 0
22.10.2002, 18:13:36
    #32060908
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
Нет, в процедуре есть параметр типа DateTime Input/Output
в него я передаю значение с милисекундами и ничего не делая над этим параметром в процедуре получаю его назад уже округленным в процедуре самим сервером
ЗЫ: вывод этого параметра специально делаю для проверки


Re:
Погодь! Я не понял что-то... база тут при чём?
ты передаёшь параметр, а когда он доходит до SQL он уже каким-то образом округлён. так? Значит источник неприятностей в механизме передачи параметров, а это, наверное, не база, а делфи+АДО там или ещё какая-нибудь хрень. Как думаешь?
...
Рейтинг: 0 / 0
22.10.2002, 18:19:36
    #32060910
Luchkin Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
Всё-таки, почему ты решил, что "сервером"...
Допустим, я передаю параметр в процедуру через TADOQuery.Parameters.ParamByName('daCnageDT').Value:= <время_с_миллисекундами>
а в процедуре полученный параметр сразу возвращаю и он возвращается без миллисекунд, то я бы подумал ещё, кто округляет...
...
Рейтинг: 0 / 0
22.10.2002, 18:24:23
    #32060916
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
Не знаю у тебя там что-то неладно:(
Счас спец.слабал тест процу - нормально,что передал,то и вернуло.
Кусок процы покань,плз
...
Рейтинг: 0 / 0
22.10.2002, 18:46:20
    #32060927
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
вот щас слабал тестовую процедуру
CREATE PROCEDURE [dbo].[sa_Organizations_Update1]
@iOrgID int,
@daChangeDT nvarchar(100)
AS
SET NOCOUNT ON

UPDATE [dbo].[Organizations]
SET
[ChangeDT] = getdate()
WHERE
[OrgID] = @iOrgID AND ChangeDT=CAST(@daChangeDT as datetime)
GO

передаю в нее второй параметр
'2002-NOV-22 17:35:16.013'
ругается что не может перевести в DateTime

Че это?
...
Рейтинг: 0 / 0
22.10.2002, 18:49:06
    #32060928
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
а при попытке создать эту процедуру с параметром DateTime при запуске процедуры со значением
'2002-NOV-22 17:35:16.013' вообще не срабатывает - сразу ругается на некорректное значение
...
Рейтинг: 0 / 0
22.10.2002, 18:56:25
    #32060931
Luchkin Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
KAK?! KAK ты передаёшь параметр?!!
Напиши плз кусок, где ты себе берёшь значение и где передаёшь параметр.
...
Рейтинг: 0 / 0
22.10.2002, 18:58:45
    #32060933
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
в Query Analyzere
...
Рейтинг: 0 / 0
22.10.2002, 19:05:53
    #32060935
Luchkin Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
CREATE PROCEDURE [dbo].[sa_Organizations_Update1]
@iOrgID int,
@daChangeDT datetime
AS
SET NOCOUNT ON

UPDATE [dbo].[Organizations]
SET
[ChangeDT] = getdate()
WHERE
[OrgID] = @iOrgID AND ChangeDT=@daChangeDT)
GO

передаю в нее второй параметр
QA: exec sa_Organizations_Update1 1, CAST('2002-11-22 17:35:16.013' as datetime)
или просто
select CAST('2002-11-22 17:35:16.013' as datetime)
----- работает
сравни формат того, что ты передаёшь, как параметр
с форматом select getDate(). Должны быть одинаковые.
...
Рейтинг: 0 / 0
22.10.2002, 20:06:02
    #32060961
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
вот такой формат всегда работает.... не зависимо от ваших настроек....
'YYYYMMDD HH:MM:SS:mmm'
YYYY год
MM месяц
DD день
HH часы
MM минуты
SS секунды
sss микросекунды
например '20021022 20:05:34:123'
и еще.... можно использовать децимал или флоат или варбин......
...
Рейтинг: 0 / 0
23.10.2002, 10:13:44
    #32061048
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
Меня уже кондражка хватает:
я получаю DateTime из SQL работаю с ним в .NET и возвращаю его как DateTime в процедуру в SQL - и он зараза не понимает свой же формат. Это же маразм просто! такого же не должно быть.
И еще - почему QA отображает милисекунды, а EM и .NET(без изврата) не отображают ?
...
Рейтинг: 0 / 0
23.10.2002, 10:34:19
    #32061062
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новая версия вопроса
2 sp
Вариант, гарантированно работающий правильно, хорошо справляющийся с нагрузкой (куча пользователей, сессий) и требующий мало ресурсов - это тот, который вначале предложил Luchkin Dmitry - с временной таблицой и полем TIMESTAMP
Причём временную таблицу нужно использовать при редактировании набора записей, а для одной записи - просто передавать это поле в параметре, как вы делаете для datetime.

Использование datetime и сравнение не решает задачи, т.к. два пользователя теоретически могут сделать обновление в одно время.
Ну а передача datetime всегда правильная, если использовать фориат 'YYYYMMDD HH:MM:SS:mmm'
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Новая версия вопроса / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]