powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Новая версия вопроса
26 сообщений из 26, показаны все 2 страниц
Новая версия вопроса
    #32060843
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
Новая версия вопроса
    #32060846
vap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
=Хочу реализовать обновление записи только в том случае если она с момента считывания никем не изменена
Используй тип TIMESTAMP
...
Рейтинг: 0 / 0
Новая версия вопроса
    #32060848
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но хочется также и иметь представление когда запись была изменена
...
Рейтинг: 0 / 0
Новая версия вопроса
    #32060850
sergwsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть Тип параметра TimeStamp ?
...
Рейтинг: 0 / 0
Новая версия вопроса
    #32060855
vap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используй тригер на обновление.
А вообще нехорошо использовать в WHERE время+милисекунды, это дополнительный элемент нестабильности. Сегодня обновляется, завтра перестанет...
...
Рейтинг: 0 / 0
Новая версия вопроса
    #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
Новая версия вопроса
    #32060863
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да я б не использовал бы время+милисекунды дак эта процедура getdate() вставляет их и я уже обязан во WHERE указать оригинальное значение
...
Рейтинг: 0 / 0
Новая версия вопроса
    #32060864
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
Новая версия вопроса
    #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
Новая версия вопроса
    #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
Новая версия вопроса
    #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
Новая версия вопроса
    #32060892
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
получается что в MSSQL работать с типом DateTime практически невозможно работать - если я буду производить поиск записи созданной именно в заданный момент времени указанной даты - я просто запись не найду или если сделать условие интервалом (что есть криво) - получу кучу записей и уж потом я должен анализировать подходит ли запись близко к запросу или нет.
Обидно - в других базах такого бардака нет - внутреннее представление форматов данных совпадает с внешним т.е. если в поле есть милисекунды - они видны и с ними можно нормально работать
...
Рейтинг: 0 / 0
Новая версия вопроса
    #32060898
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
22-10-2002 15:59:39.327 и 22-10-2002 15:59:40.000
таки разные даты
...
Рейтинг: 0 / 0
Новая версия вопроса
    #32060900
Фотография Luchkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Погодь! Я не понял что-то... база тут при чём?
ты передаёшь параметр, а когда он доходит до SQL он уже каким-то образом округлён. так? Значит источник неприятностей в механизме передачи параметров, а это, наверное, не база, а делфи+АДО там или ещё какая-нибудь хрень. Как думаешь?
...
Рейтинг: 0 / 0
Новая версия вопроса
    #32060908
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, в процедуре есть параметр типа DateTime Input/Output
в него я передаю значение с милисекундами и ничего не делая над этим параметром в процедуре получаю его назад уже округленным в процедуре самим сервером
ЗЫ: вывод этого параметра специально делаю для проверки


Re:
Погодь! Я не понял что-то... база тут при чём?
ты передаёшь параметр, а когда он доходит до SQL он уже каким-то образом округлён. так? Значит источник неприятностей в механизме передачи параметров, а это, наверное, не база, а делфи+АДО там или ещё какая-нибудь хрень. Как думаешь?
...
Рейтинг: 0 / 0
Новая версия вопроса
    #32060910
Фотография Luchkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё-таки, почему ты решил, что "сервером"...
Допустим, я передаю параметр в процедуру через TADOQuery.Parameters.ParamByName('daCnageDT').Value:= <время_с_миллисекундами>
а в процедуре полученный параметр сразу возвращаю и он возвращается без миллисекунд, то я бы подумал ещё, кто округляет...
...
Рейтинг: 0 / 0
Новая версия вопроса
    #32060916
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю у тебя там что-то неладно:(
Счас спец.слабал тест процу - нормально,что передал,то и вернуло.
Кусок процы покань,плз
...
Рейтинг: 0 / 0
Новая версия вопроса
    #32060927
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
Новая версия вопроса
    #32060928
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а при попытке создать эту процедуру с параметром DateTime при запуске процедуры со значением
'2002-NOV-22 17:35:16.013' вообще не срабатывает - сразу ругается на некорректное значение
...
Рейтинг: 0 / 0
Новая версия вопроса
    #32060931
Фотография Luchkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KAK?! KAK ты передаёшь параметр?!!
Напиши плз кусок, где ты себе берёшь значение и где передаёшь параметр.
...
Рейтинг: 0 / 0
Новая версия вопроса
    #32060933
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в Query Analyzere
...
Рейтинг: 0 / 0
Новая версия вопроса
    #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
Новая версия вопроса
    #32060961
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот такой формат всегда работает.... не зависимо от ваших настроек....
'YYYYMMDD HH:MM:SS:mmm'
YYYY год
MM месяц
DD день
HH часы
MM минуты
SS секунды
sss микросекунды
например '20021022 20:05:34:123'
и еще.... можно использовать децимал или флоат или варбин......
...
Рейтинг: 0 / 0
Новая версия вопроса
    #32061048
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня уже кондражка хватает:
я получаю DateTime из SQL работаю с ним в .NET и возвращаю его как DateTime в процедуру в SQL - и он зараза не понимает свой же формат. Это же маразм просто! такого же не должно быть.
И еще - почему QA отображает милисекунды, а EM и .NET(без изврата) не отображают ?
...
Рейтинг: 0 / 0
Новая версия вопроса
    #32061062
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 sp
Вариант, гарантированно работающий правильно, хорошо справляющийся с нагрузкой (куча пользователей, сессий) и требующий мало ресурсов - это тот, который вначале предложил Luchkin Dmitry - с временной таблицой и полем TIMESTAMP
Причём временную таблицу нужно использовать при редактировании набора записей, а для одной записи - просто передавать это поле в параметре, как вы делаете для datetime.

Использование datetime и сравнение не решает задачи, т.к. два пользователя теоретически могут сделать обновление в одно время.
Ну а передача datetime всегда правильная, если использовать фориат 'YYYYMMDD HH:MM:SS:mmm'
...
Рейтинг: 0 / 0
Новая версия вопроса
    #32061071
Фотография Nickolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу реализовать обновление записи только в том случае если она с момента считывания никем не изменена - т.е. в процедуре Update существует условие обновления
Может конечно совсем не в тему, но если так реализован многопользовательский интерфейс к БД, то это в корне не правильно!
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Новая версия вопроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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