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

Откуда:
Сообщений: 4
Уважаемые участники форума, здравствуйте!

нужна ваша помощь.

Мне необходимо удалять в базе данных записи, которые созданы более, чем три месяца назад (для чистки базы).

дата создания пишется в двух форматах. первый формат для чтения записи человеком, как пример - Wed Dec 11 13:34:38 MSK 2019 и второй для систем в unix-формате - пример 1576060478375.

Пробовал разные варианты, если сравнивать текущую дату через функцию SYSUTCDATETIME , то я не знаю как задать фортат записи Wed Dec 11 13:34:38 MSK 2019 - в формате даты - просто нет обозначения MSK.
Если брать второй вариант, то не понятно как задать разницу между текущим временем в unix формате и сравнить с нужным мне условием.

Самым простым кажется след. действия это вычислить текущее время в unixtime - это SELECT DATEDIFF_BIG(MILLISECOND,'1970-01-01 00:00:00.000', SYSUTCDATETIME()) Milliseconds;

далее отнять от этого три месяца в unix-формате и сравнить с датой создания в unix-формате.

Но как эту логику соединить воедино и сделать работающий вариант ума не приложу.

дайте пожалуйста, пинок в правильное направление?
12 дек 19, 09:54    [22038363]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей старше, чем 3 месяца  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20491
Snaut1
дата создания пишется в двух форматах. первый формат для чтения записи человеком, как пример - Wed Dec 11 13:34:38 MSK 2019 и второй для систем в unix-формате - пример 1576060478375.
Да пофиг, как оно отображается. Показывайте DDL таблицы (и можно пример содержимого, 1-2 записи).
В двух форматах - это два отдельных поля?
12 дек 19, 09:57    [22038371]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей старше, чем 3 месяца  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 1396
Snaut1,

Timestamp - это не то. В месяце разное число дней. Тебе нужен календарь. Ищи, он там должен быть. Даже в mysql можно отнять 3 месяца от даты.
12 дек 19, 09:58    [22038376]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей старше, чем 3 месяца  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 1396
Snaut1
дата создания пишется в двух форматах. первый формат для чтения записи человеком, как пример - Wed Dec 11 13:34:38 MSK 2019 и второй для систем в unix-формате - пример 1576060478375

Не нужно. Есть встроенный формат даты (который под капотом - timestamp). А юзеру преобразовывай его во что хочешь.
12 дек 19, 09:59    [22038381]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей старше, чем 3 месяца  [new]
Snaut1
Member

Откуда:
Сообщений: 4
Akina
Snaut1
дата создания пишется в двух форматах. первый формат для чтения записи человеком, как пример - Wed Dec 11 13:34:38 MSK 2019 и второй для систем в unix-формате - пример 1576060478375.
Да пофиг, как оно отображается. Показывайте DDL таблицы (и можно пример содержимого, 1-2 записи).
В двух форматах - это два отдельных поля?


да, два формата - это два отдельных поля, вот пример выборки

К сообщению приложен файл. Размер - 20Kb
12 дек 19, 10:07    [22038397]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей старше, чем 3 месяца  [new]
Snaut1
Member

Откуда:
Сообщений: 4
crutchmaster
Snaut1,

Timestamp - это не то. В месяце разное число дней. Тебе нужен календарь. Ищи, он там должен быть. Даже в mysql можно отнять 3 месяца от даты.


да мне не принципиально точное количество дней. Можно взять за основу просто - 90 дней и все.
12 дек 19, 10:08    [22038398]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей старше, чем 3 месяца  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31331
Snaut1
Но как эту логику соединить воедино и сделать работающий вариант ума не приложу.
Хм, а что сложного?

Вы вычислили "текущее время в unixtime", далее вычисляете "текущее время минус 3 месяца в unixtime", то есть от SYSUTCDATETIME() нужно отнять 3 месяца

Удаление делается командой DELETE, условие удаления: "датой создания в unix-формате" < "текущее время минус 3 месяца в unixtime"
12 дек 19, 10:09    [22038399]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей старше, чем 3 месяца  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31331
Akina
В двух форматах - это два отдельных поля?
Поле "для чтения записи человеком" ему не нужно для решения этой задачи.
12 дек 19, 10:10    [22038401]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей старше, чем 3 месяца  [new]
Snaut1
Member

Откуда:
Сообщений: 4
alexeyvg
Snaut1
Но как эту логику соединить воедино и сделать работающий вариант ума не приложу.
Хм, а что сложного?

Вы вычислили "текущее время в unixtime", далее вычисляете "текущее время минус 3 месяца в unixtime", то есть от SYSUTCDATETIME() нужно отнять 3 месяца

Удаление делается командой DELETE, условие удаления: "датой создания в unix-формате" < "текущее время минус 3 месяца в unixtime"


Логику я понял, мне бы это как записать, учитывая, что я не спец по MSSQL. Это делается через переменные? DECLARE?

Т.е. первая переменная - это текущее время в unix формате, вторая переменная - текущее время минус три месяца?
12 дек 19, 10:16    [22038406]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей старше, чем 3 месяца  [new]
invm
Member

Откуда: Москва
Сообщений: 9279
Snaut1
Wed Dec 11 13:34:38 MSK 2019 и второй для систем в unix-формате - пример 1576060478375.
declare @unix_time bigint = 1576060478375;
select
 cast(switchoffset(dateadd(ms, @unix_time % 1000, dateadd(s, @unix_time / 1000, cast('19700101' as datetime2))), datepart(tz, SYSDATETIMEOFFSET())) as datetime2),
 cast(switchoffset(dateadd(ms, @unix_time % 1000, dateadd(s, @unix_time / 1000, '19700101')), datepart(tz, SYSDATETIMEOFFSET())) as datetime2);
12 дек 19, 10:26    [22038417]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей старше, чем 3 месяца  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 1396
Snaut1,

Так еще проще. Находишь все таймштампы, которые меньше текущего более чем на 90*24*60*60*1000 мс.
delete from table where ts < cur_ts - (90*24*60*60*1000)


Сообщение было отредактировано: 12 дек 19, 10:33
12 дек 19, 10:29    [22038424]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей старше, чем 3 месяца  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
crutchmaster
Snaut1
дата создания пишется в двух форматах. первый формат для чтения записи человеком, как пример - Wed Dec 11 13:34:38 MSK 2019 и второй для систем в unix-формате - пример 1576060478375

Не нужно. Есть встроенный формат даты (который под капотом - timestamp). А юзеру преобразовывай его во что хочешь.
Это серьёзно что ли? И давно так?
TIMESTAMP - это вообще никакая не дата!
12 дек 19, 17:04    [22038967]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей старше, чем 3 месяца  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 1396
iap
Это серьёзно что ли? И давно так?

Обычно дата хранится в как длинное целое со знаком и представляет собой число миллисекунд, относительно 01.01.1970. Ну, в mssql, конечно, может быть всё через жопу, спорить не буду.
iap
TIMESTAMP - это вообще никакая не дата!

Х-спаде, а что тогда это?
13 дек 19, 05:42    [22039297]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей старше, чем 3 месяца  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31331
crutchmaster
iap
TIMESTAMP - это вообще никакая не дата!

Х-спаде, а что тогда это?
Это целочисленный 8 байтный увеличивающийся счётчик уровня сервера.
Правда, сейчас его называют rowversion, тип данных TIMESTAMP устарело, и не рекомендуется к использованию.

docs
timestamp is the synonym for the rowversion data type and is subject to the behavior of data type synonyms. In DDL statements, use rowversion instead of timestamp wherever possible.

The Transact-SQL timestamp data type is different from the timestamp data type defined in the ISO standard.

https://docs.microsoft.com/en-us/sql/t-sql/data-types/rowversion-transact-sql
13 дек 19, 09:08    [22039346]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей старше, чем 3 месяца  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31331
crutchmaster
Обычно дата хранится в как длинное целое со знаком и представляет собой число миллисекунд, относительно 01.01.1970.
"Обычно" где, в мэйнфреймах? :-)

Тут вообще форум по конкретному продукту, зачем выдавать свои представления о том, как выгодней хранить дату-время, за устройство этого продукта? Он устроен не так.

crutchmaster
Ну, в mssql, конечно, может быть всё через жопу, спорить не буду.
Вы ещё Била упомяните :-)
Понятно же, что это не "в mssql", а в Sybase, Микрософт был бы рад сделать нативное хранение, зачем им лишний раз пересчитывать, и вносить путаницу?

Сообщение было отредактировано: 13 дек 19, 09:15
13 дек 19, 09:12    [22039350]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей старше, чем 3 месяца  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 1396
alexeyvg
Понятно же, что это не "в mssql", а в Sybase, Микрософт был бы рад сделать нативное хранение, зачем им лишний раз пересчитывать, и вносить путаницу?

Ясно, я больше сюда ни ногой.
13 дек 19, 10:26    [22039420]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить