0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 16

Как от даты отнять год, месяц, день?

23.12.2015, 10:23. Показов 87065. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Подскажите, как получить Data_N:
Есть таблица вида:
|Data |Y|M|D|Data_N|
|01.11.2015|4|3|5| |

где, Data - дата от которой нужно отнять кол-во Y - лет, М - месяцев, D - дней, и получившееся в результате число записать в Data_N. (если как в примере: 01.11.2015 - 4 года - 3 месяца - 5 дней = 27.07.2011

Заранее благодарен.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.12.2015, 10:23
Ответы с готовыми решениями:

Как изменить год в поле дата не меняя месяц и число
Помогите кто может!!! Как изменить год в поле дата не меняя месяц и число с помощью FoxPro 2.6???

Как в maskedit с форматом даты увеличить ее на год, месяц или день?
Есть маскэдит. Маска ввода Дата. Надо чтобы при нажатии на кнопку эта дата увеличивалась. Надо чтобы пользователь сам что увеличить( ну это...

Отсортировать даты по 4 параметрам: год, месяц, день, время
Есть даты такого формата: Fri, 28 Mar 2014 16:42:58 PDT Fri, 28 Mar 2014 15:16:47 PDT Sat, 29 Mar 2014 13:33:05 PDT Sat, 29 Mar...

13
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
23.12.2015, 10:30
Цитата Сообщение от deret24 Посмотреть сообщение
Подскажите, как получить Data_N
отнять год
SQL
1
2
SELECT ADD_MONTHS(to_date('01.01.2015', 'dd.mm.yyyy'), -12)
FROM dual
1
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
23.12.2015, 11:33
В Oracle есть две функции: NUMTOYMINTERVAL (интервал год-месяц) и NUMTODSINTERVAL (интервал день-секунда). С их помошью можно записать:
SQL
1
2
3
4
5
SELECT to_date('20150101','yyyymmdd') 
       - NUMTOYMINTERVAL(5, 'year') 
       - NUMTOYMINTERVAL(3, 'month') 
       - NUMTODSINTERVAL(7, 'day')
FROM dual;
Если заданы только месяцы, то лучше всего пользоваться функцией
Цитата Сообщение от Grossmeister Посмотреть сообщение
ADD_MONTHS
Если заданы только дни, то можно их просто прибавить к дате или отнять от даты:
SQL
1
SELECT to_date('20150101','yyyymmdd')  - 17 FROM dual;
1
Zero day
 Аватар для Meridian21
267 / 231 / 78
Регистрация: 16.12.2015
Сообщений: 943
Записей в блоге: 4
23.12.2015, 12:04
Я бы делал в общем виде, но по сути AGK уже решение подсказал
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
DECLARE
  p_yy   NUMBER;
  p_mm   NUMBER;
  p_dd   NUMBER;
  p_date DATE;
  p_res  CHAR(10);
BEGIN
  SELECT '&"Исходная дата - в формате dd.mm.yyyy - "'
    INTO p_date
    FROM dual;
  SELECT &"Сколько нужно вычесть лет - "
    INTO p_yy
    FROM dual;
  SELECT &"Сколько нужно вычесть месяцев - "
    INTO p_mm
    FROM dual;
  SELECT &"Сколько нужно вычесть дней - "
    INTO p_dd
    FROM dual;
  SELECT to_char(p_date - NUMTOYMINTERVAL(p_yy, 'year') -
                         NUMTOYMINTERVAL(p_mm, 'month') -
                         NUMTODSINTERVAL(p_dd, 'day')),
                 'dd.mm.yyyy')
    INTO p_res
    FROM dual;
  dbms_output.put_line(p_res);
END;
1
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
23.12.2015, 12:21
Все верно, но не факт, что требуется вводить данные с клавиатуры, а потом выводить на консоль (экран). Возможно, требуется каким-то образом обработать содержимое нескольких таблиц и результат запихнуть еще в одну таблицу. Так что Ваше
Цитата Сообщение от Meridian21 Посмотреть сообщение
Я бы делал в общем виде
на самом деле есть очень и очень частный случай, а совсем не общий вид. Так что сойдемся на том, что Вы привели пример использования.

У меня, собственно, тоже всего лишь пример использования, но без наворотов, связанных с консольным вводом и выводом
1
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 16
23.12.2015, 21:32  [ТС]
Цитата Сообщение от Meridian21 Посмотреть сообщение
SELECT '&"Исходная дата - в формате dd.mm.yyyy - "'

Дело в том что в данной таблице много записей, как в запросе SELECT указать чтоб поле Data_N всё заполнилось автоматически?
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
23.12.2015, 23:24
Цитата Сообщение от deret24 Посмотреть сообщение
поле Data_N всё заполнилось автоматически
Есть два способа:
1) Открывается курсор, в котором собираются все исходные данные, затем в цикле по курсору делается UPDATE нужного поля.
2) Пишется сложный оператор UPDATE, в котором и происходит корректировка данных.
Попробуйте почитать про курсоры и написать какой-нибудь пример курсора, потом будем подправлять
1
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 16
25.12.2015, 10:09  [ТС]
беру перерывчик, прихворал я
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
25.12.2015, 11:50
В простом случае вроде Вашего, когда все поля в одной таблице, лучше сразу писать UPADTE вида
SQL
1
2
3
UPADTE "TABLE_NAME"
      SET DATA_N = "FUNCTION_ON_TABLE_FIELDS"
WHERE "LIMITATION_CONDITION";
Добавлено через 30 минут
Если у Вас есть несколько таблиц, из которых нужно собрать данные, номер с апдейтом обычно не проходит
1
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 16
25.12.2015, 13:17  [ТС]
Цитата Сообщение от AGK Посмотреть сообщение
Если у Вас есть несколько таблиц, из которых нужно собрать данные, номер с апдейтом обычно не проходит
таблица одна, а наведённые поля её часть, это, грубо говоря, таблица содержащая данные по работникам (много работников), со стажем (это те самые Y M D) на число (data) и нужно "заполнить" дату с которой начинается стаж (data_N) по всей этой таблице. Я не могу "подобрать" что бы работала запись вида t.data_N = t.data - t.Y - t.M -t.D, как говориться, моя понимать, что нужно в цикле в процедуре\функции это запускать
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
25.12.2015, 13:33
Лучший ответ Сообщение было отмечено deret24 как решение

Решение

Цитата Сообщение от deret24 Посмотреть сообщение
то нужно в цикле ... это запускать
Да не нужно в цикле. В отличие от алгоритмических языков здесь нужно работать блоками. Голова должна начать работать по-другому, это не сразу получается, по себе помню. Вы просто пишете один апдейт, и он в одном заходе выполняет все нужные действия. Цикл у Вас спрятан внутри, он на низком уровне, в отличие от реализации на алгоритмическом языке. Пишете
SQL
1
2
3
4
5
UPADTE "TABLE_NAME"
      SET DATA_N = DATA- NUMTOYMINTERVAL(Y, 'year') 
       - NUMTOYMINTERVAL(M, 'month') 
       - NUMTODSINTERVAL(D, 'day')
WHERE "LIMITATION_CONDITION";
, и все дела

Добавлено через 3 минуты
По поводу "LIMITATION_CONDITION". Например, Вы хотите заполнять только те даты, которые еще не заполнены. Тогда в качестве where_clause следует писать
SQL
1
 WHERE DATA_N IS NULL;
1
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 16
25.12.2015, 13:46  [ТС]
Цитата Сообщение от AGK Посмотреть сообщение
SQL
1
2
3
4
5
UPADTE "TABLE_NAME"
SET DATA_N = DATA- NUMTOYMINTERVAL(Y, 'year')
- NUMTOYMINTERVAL(M, 'month')
- NUMTODSINTERVAL(D, 'day')
WHERE "LIMITATION_CONDITION";
Во всех примерах я видел только "явное задавание" data, Y, M, D в виде данных, а как из поля взять, вот в чём загвоздка! может я и туплю
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
25.12.2015, 13:52
Цитата Сообщение от deret24 Посмотреть сообщение
Есть таблица вида:
|Data |Y|M|D|Data_N|
|01.11.2015|4|3|5| |
Я так понял, что Y,M, D - это имена соответствующих полей. В качестве аргумента функции можно брать либо имя поля, либо задавать этот аргумент явно, в виде какого-нибудь значения. Если Вы вызываете где-нибудь в программе sin(x), Вы можете написать v1:=sin(2); , а можете написать p1:=2; v1:=sin(p1); . Вы до сих пор сталкивались только с 1-м вариантом. Теперь я предлагаю Вам 2-й.
1
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 16
25.12.2015, 14:07  [ТС]
Цитата Сообщение от AGK Посмотреть сообщение
Теперь я предлагаю Вам 2-й.
УРАААА!!! СКЛАД!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.12.2015, 14:07
Помогаю со студенческими работами здесь

Дан строковый файл, содержащий даты в формате «день/месяц/год»
Дан строковый файл, содержащий даты в формате «день/месяц/год», причем под день и месяц отводится по две позиции, а под год — четыре...

Создать класс для представления даты с полями год, месяц, день
Мне нужно создать класс для представления даты с полями год, месяц, день и в случае недопустимых значений полей выбрасывать исключения. Так...

Организовать поиск файлов в директории по атрибутам текущей даты создания (день, месяц, год)
Задача, организовать поиск файлов в директории по атрибутам текущей даты создания (день месяц год) с возможностью перенаправления...

Как от текущей даты отнять один месяц?
Подскажите пожалуйста, как от текущей даты отнять один месяц.

Создайте класс «Дата» со свойствами год, високосный год, месяц, день месяца и день недели
Создайте класс «Дата» со свойствами год, високосный год, месяц, день месяца и день недели. Создайте для него метод котрый бы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

Новые блоги и статьи
Как использовать Bluetooth-модуль HC-05 с Arduino
Wired 08.07.2025
Bluetooth - это технология, созданная чтобы заменить кабельные соединения. Обычно ее используют для связи небольших устройств: мобильных телефонов, ноутбуков, наушников и т. д. Работает она на частоте. . .
Руководство по структурам данных Python
AI_Generated 08.07.2025
Я отчетливо помню свои первые серьезные проекты на Python - я писал код, он работал, заказчики были относительно довольны. Но однажды мой наставник, взглянув на мою реализацию поиска по огромному. . .
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах
Programma_Boinc 08.07.2025
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах Опубликовано: 07. 07. 2025 Рубрика: Uncategorized Автор: AlexA Статья размещается на сайте с разрешения. . .
Раскрываем внутренние механики Android с помощью контекста и манифеста
mobDevWorks 07.07.2025
Каждый Android-разработчик сталкивается с Context и манифестом буквально в первый день работы. Но много ли мы задумываемся о том, что скрывается за этими обыденными элементами? Я, честно говоря,. . .
API на базе FastAPI с Python за пару минут
AI_Generated 07.07.2025
FastAPI - это относительно молодой фреймворк для создания веб-API, который за короткое время заработал бешеную популярность в Python-сообществе. И не зря. Я помню, как впервые запустил приложение на. . .
Основы WebGL. Раскрашивание вершин с помощью VBO
8Observer8 05.07.2025
На русском https:/ / vkvideo. ru/ video-231374465_456239020 На английском https:/ / www. youtube. com/ watch?v=oskqtCrWns0 Исходники примера:
Мониторинг микросервисов с OpenTelemetry в Kubernetes
Mr. Docker 04.07.2025
Проблема наблюдаемости (observability) в Kubernetes - это не просто вопрос сбора логов или метрик. Это целый комплекс вызовов, которые возникают из-за самой природы контейнеризации и оркестрации. К. . .
Проблемы с Kotlin и Wasm при создании игры
GameUnited 03.07.2025
В современном мире разработки игр выбор технологии - это зачастую балансирование между удобством разработки, переносимостью и производительностью. Когда я решил создать свою первую веб-игру, мой. . .
Создаем микросервисы с Go и Kubernetes
golander 02.07.2025
Когда я только начинал с микросервисами, все спорили о том, какой язык юзать. Сейчас Go (или Golang) фактически захватил эту нишу. И вот почему этот язык настолько заходит для этих задач: . . .
C++23, квантовые вычисления и взаимодействие с Q#
bytestream 02.07.2025
Я всегда с некоторым скептицизмом относился к громким заявлениям о революциях в IT, но квантовые вычисления - это тот случай, когда революция действительно происходит прямо у нас на глазах. Последние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru