减去 2 个日期得到天数

Posted

技术标签:

【中文标题】减去 2 个日期得到天数【英文标题】:Subtract 2 dates to get number of Days 【发布时间】:2019-06-12 12:39:57 【问题描述】:

我正在使用优势 sql 数据库,并尝试减去 2 个日期以获得天数。我认为在 ADV SQL 中你可以只减去日期,它会给你天数。

((完成) - (开始日期))

1-23-19 - 1-3-19 = 20 天

【问题讨论】:

您的日期列是正确的类型还是字符串? 它们是日期字段 完成是一个时间戳 startdate 是一个日期 我对 Advantage 一无所知,但如果您首先必须在进行减法之前将时间戳转换为日期,这将是有意义的 这是导致问题的时间戳字段。我不知道如何在 ADV sql 中将时间戳转换为日期字段。投射或转换不起作用。我是 ADV SQL 的新手,我不关心它 【参考方案1】:

如果两者都是DATE 类型,您可以直接在ADS SQL 中减去日期。如果它们都是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

【讨论】:

【参考方案2】:

我认为timestampdiff() 应该做你想做的事:

timestampdiff(SQL_TSI_DAY, startdate, completed)

【讨论】:

它不工作。我不确定是不是因为 1 是时间戳而 1 只是日期?【参考方案3】:

这是一个非常不寻常的数据库,可供您提问 - 文档建议 (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(时间间隔,timestamp1,timestamp2)

根据减去时间戳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。

【讨论】:

我在使用您的代码时收到此错误消息。 [SAP][Adv​​antage SQL Engine]标量函数的参数无效:TIMESTAMPDIFF。参数必须是字符、日期、时间或时间戳。 -- SQL语句中的错误位置是:232(行:6列:5) 支持文档显示cast,所以试试 cast(yourDateField as SQL_TIMESTAMP) poQuery:错误 7200:AQE 错误:状态 = S0000;本机错误 = 2159; [SAP][Adv​​antage SQL Engine]标量函数的参数无效:TIMESTAMPDIFF。参数必须是字符、日期、时间或时间戳。 -- SQL语句中的错误位置是:291(行:7列:5) @BrianK - 我很想对双方都进行投射,看看它做了什么 - 很可能类型不是你所期望的。 @BrianK,这可能是由于您的日期参考。您在处理实际的日期/时间字段吗?来自提供的字符串输入?如果是字符串格式,则应以“yyyy-MM-dd”格式显示,而不是根据您的示例显示为 MM-dd-yy

以上是关于减去 2 个日期得到天数的主要内容,如果未能解决你的问题,请参考以下文章

查找日期之间的天数

使用 Moment.js 格式化日期并减去天数

java日期相减得到天数

java中的当前时间减去天数

LINQ to Entity 减去 2 个日期

使用 SORT 从日期中减去天数