Вычтите 2 даты, чтобы получить количество дней - PullRequest
0 голосов
/ 12 июня 2019

Я работаю в базе данных sql плюсов и пытаюсь вычесть 2 даты, чтобы получить количество дней. Я думал, что в ADV SQL вы можете просто вычесть даты, и это даст вам количество дней.

((завершено) - (дата начала))

1-23-19 - 1-3-19 = 20 дней

Ответы [ 3 ]

1 голос
/ 28 июня 2019

Вы можете напрямую вычитать даты в ADS SQL, если оба типа DATE. Если они оба TIMESTAMP, вы можете использовать TIMESTAMPDIFF() с TSI_SQL_DAYS в качестве интервала. Если один DATE, а другой TIMESTAMP, вам необходимо преобразовать TIMESTAMP в DATE, а затем вы можете напрямую вычесть.

Вот примеры всех трех из этих альтернатив.

С обоими столбцами типа DATE:

create table Test (ID integer, StartDate Date, Completed Date);
insert into Test values (1, '2019-01-01', '2019-01-31');
insert into Test values (2, '2019-01-01', '2018-02-28');
select id, startdate, completed, completed - startdate as days from test;

Выход:

id  startdate    completed    days      
--- -----------  -----------  ----
1   01/01/2019   01/31/2019     30
2   01/01/2019   02/28/2019     58

С обоими столбцами типа TIMESTAMP:

create table Test2 (ID integer, StartDate TimeStamp, Completed TimeStamp);
insert into Test2 (ID, StartDate, Completed)
  values (1, CreateTimeStamp(2019, 1, 1, 0, 0, 0, 1),
             CreateTimeStamp(2019, 1, 31, 0, 0, 0, 1));
insert into Test2 (ID, StartDate, Completed)
  values (2, CreateTimeStamp(2019, 1, 1, 0, 0, 0, 1),
             CreateTimeStamp(2019, 2, 28, 0, 0, 0, 1));
select id, startdate, completed, 
  TimeStampDiff(SQL_TSI_DAY, StartDate, Completed) as days from test2;

Выход:

id  startdate    completed    days      
--- -----------  -----------  ----
  1 01/01/2019   01/31/2019     30
  2 01/01/2019   02/28/2019     58

С одним DATE и одним TIMESTAMP:

create table Test3 (ID integer, StartDate TimeStamp, Completed Date);
insert into Test3 (ID, StartDate, Completed)
  values (1, CreateTimeStamp(2019, 1, 1, 0, 0, 0, 1), '2019-01-31');
insert into Test3 (ID, StartDate, Completed)
  values (2, CreateTimeStamp(2019, 1, 1, 0, 0, 0, 1), '2019-02-28');
select id, startdate, completed, 
  Completed - Cast(StartDate AS SQL_DATE) as days from test3;

Выход:

id  startdate    completed    days      
--- -----------  -----------  ----
  1 01/01/2019   01/31/2019     30
  2 01/01/2019   02/28/2019     58
0 голосов
/ 12 июня 2019

Это довольно необычная БД, на которую можно задавать вопросы - документы предлагают (https://devzone.advantagedatabase.com/dz/webhelp/advantage10/index.html?master_supported_scalar_functions.htm), что вам нужно:

TIMESTAMPDIFF(SQL_TSI_DAY,completed, startdate)

Редактировать: включая актерский состав

TIMESTAMPDIFF(SQL_TSI_DAY,completed, cast(startdate as SQL_TIMESTAMP))

Документы:

TIMESTAMPDIFF (интервал, отметка времени1, отметка времени2)

Возвращает количество целочисленных интервалов на основе вычитания временной метки1. из отметки времени2. Поддерживаемые значения интервала: SQL_TSI_FRAC_SECOND, SQL_TSI_SECOND, SQL_TSI_MINUTE, SQL_TSI_HOUR, SQL_TSI_DAY, SQL_TSI_WEEK, SQL_TSI_MONTH, SQL_TSI_QUARTER, SQL_TSI_YEAR.

0 голосов
/ 12 июня 2019

Я думаю timestampdiff() должен делать то, что вы хотите:

timestampdiff(SQL_TSI_DAY, startdate, completed)
...