减去 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][Advantage SQL Engine]标量函数的参数无效:TIMESTAMPDIFF。参数必须是字符、日期、时间或时间戳。 -- SQL语句中的错误位置是:232(行:6列:5) 支持文档显示cast
,所以试试 cast(yourDateField as SQL_TIMESTAMP)
poQuery:错误 7200:AQE 错误:状态 = S0000;本机错误 = 2159; [SAP][Advantage SQL Engine]标量函数的参数无效:TIMESTAMPDIFF。参数必须是字符、日期、时间或时间戳。 -- SQL语句中的错误位置是:291(行:7列:5)
@BrianK - 我很想对双方都进行投射,看看它做了什么 - 很可能类型不是你所期望的。
@BrianK,这可能是由于您的日期参考。您在处理实际的日期/时间字段吗?来自提供的字符串输入?如果是字符串格式,则应以“yyyy-MM-dd”格式显示,而不是根据您的示例显示为 MM-dd-yy以上是关于减去 2 个日期得到天数的主要内容,如果未能解决你的问题,请参考以下文章