powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Удаление записей старше, чем 3 месяца
16 сообщений из 16, страница 1 из 1
Удаление записей старше, чем 3 месяца
    #39901663
Snaut1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые участники форума, здравствуйте!

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

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

дата создания пишется в двух форматах. первый формат для чтения записи человеком, как пример - 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-формате.

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

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

Timestamp - это не то. В месяце разное число дней. Тебе нужен календарь. Ищи, он там должен быть. Даже в mysql можно отнять 3 месяца от даты.
...
Рейтинг: 0 / 0
Удаление записей старше, чем 3 месяца
    #39901675
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Snaut1
дата создания пишется в двух форматах. первый формат для чтения записи человеком, как пример - Wed Dec 11 13:34:38 MSK 2019 и второй для систем в unix-формате - пример 1576060478375

Не нужно. Есть встроенный формат даты (который под капотом - timestamp). А юзеру преобразовывай его во что хочешь.
...
Рейтинг: 0 / 0
Удаление записей старше, чем 3 месяца
    #39901686
Snaut1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
Snaut1
дата создания пишется в двух форматах. первый формат для чтения записи человеком, как пример - Wed Dec 11 13:34:38 MSK 2019 и второй для систем в unix-формате - пример 1576060478375.
Да пофиг, как оно отображается. Показывайте DDL таблицы (и можно пример содержимого, 1-2 записи).
В двух форматах - это два отдельных поля?


да, два формата - это два отдельных поля, вот пример выборки
...
Рейтинг: 0 / 0
Удаление записей старше, чем 3 месяца
    #39901687
Snaut1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster
Snaut1,

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


да мне не принципиально точное количество дней. Можно взять за основу просто - 90 дней и все.
...
Рейтинг: 0 / 0
Удаление записей старше, чем 3 месяца
    #39901688
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Snaut1
Но как эту логику соединить воедино и сделать работающий вариант ума не приложу.
Хм, а что сложного?

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

Удаление делается командой DELETE, условие удаления: "датой создания в unix-формате" < "текущее время минус 3 месяца в unixtime"
...
Рейтинг: 0 / 0
Удаление записей старше, чем 3 месяца
    #39901689
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
В двух форматах - это два отдельных поля?
Поле "для чтения записи человеком" ему не нужно для решения этой задачи.
...
Рейтинг: 0 / 0
Удаление записей старше, чем 3 месяца
    #39901693
Snaut1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg
Snaut1
Но как эту логику соединить воедино и сделать работающий вариант ума не приложу.
Хм, а что сложного?

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

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


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

Т.е. первая переменная - это текущее время в unix формате, вторая переменная - текущее время минус три месяца?
...
Рейтинг: 0 / 0
Удаление записей старше, чем 3 месяца
    #39901697
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Snaut1
Wed Dec 11 13:34:38 MSK 2019 и второй для систем в unix-формате - пример 1576060478375.
Код: sql
1.
2.
3.
4.
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);
...
Рейтинг: 0 / 0
Удаление записей старше, чем 3 месяца
    #39901701
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Snaut1,

Так еще проще. Находишь все таймштампы, которые меньше текущего более чем на 90*24*60*60*1000 мс.
Код: sql
1.
delete from table where ts < cur_ts - (90*24*60*60*1000)
...
Рейтинг: 0 / 0
Удаление записей старше, чем 3 месяца
    #39902033
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
Snaut1
дата создания пишется в двух форматах. первый формат для чтения записи человеком, как пример - Wed Dec 11 13:34:38 MSK 2019 и второй для систем в unix-формате - пример 1576060478375

Не нужно. Есть встроенный формат даты (который под капотом - timestamp ). А юзеру преобразовывай его во что хочешь.
Это серьёзно что ли? И давно так?
TIMESTAMP - это вообще никакая не дата!
...
Рейтинг: 0 / 0
Удаление записей старше, чем 3 месяца
    #39902262
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap
Это серьёзно что ли? И давно так?

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

Х-спаде, а что тогда это?
...
Рейтинг: 0 / 0
Удаление записей старше, чем 3 месяца
    #39902298
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
iapTIMESTAMP - это вообще никакая не дата!

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

docstimestamp 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
...
Рейтинг: 0 / 0
Удаление записей старше, чем 3 месяца
    #39902302
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
Обычно дата хранится в как длинное целое со знаком и представляет собой число миллисекунд, относительно 01.01.1970.
"Обычно" где, в мэйнфреймах? :-)

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

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

Ясно, я больше сюда ни ногой.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Удаление записей старше, чем 3 месяца
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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