Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Удаление записей старше, чем 3 месяца / 16 сообщений из 16, страница 1 из 1
12.12.2019, 09:54
    #39901663
Snaut1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление записей старше, чем 3 месяца
Уважаемые участники форума, здравствуйте!

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

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

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

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

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


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

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


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

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

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

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

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


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

Т.е. первая переменная - это текущее время в unix формате, вторая переменная - текущее время минус три месяца?
...
Рейтинг: 0 / 0
12.12.2019, 10:26
    #39901697
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление записей старше, чем 3 месяца
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
12.12.2019, 10:29
    #39901701
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление записей старше, чем 3 месяца
Snaut1,

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

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

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

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

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

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

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


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