是否有与 Progress 4GL INTERVAL 函数等效的 SQL Server 函数?
Posted
技术标签:
【中文标题】是否有与 Progress 4GL INTERVAL 函数等效的 SQL Server 函数?【英文标题】:Is there an SQL Server equivalent function to Progress 4GL INTERVAL function ? 【发布时间】:2015-05-05 22:22:50 【问题描述】:我知道 Progress 4GL 版本 10 及以后的版本配备了一个非常聪明的集成函数,称为“INTERVAL”,它返回两个 DATE、DATETIME 或 DATETIME-TZ 值之间的时间间隔。 如果使用以下语法,
> DISPLAY INTERVAL(05/06/2014, 05/05/2015, "years").
会给你零,因为它短了一天才能算作一年。
但是在 SQL 中,可以使用与此相关的 closet 函数将是 DATEDIFF 并且您将无法获得相同的结果。在 SQL Server 中进行以下查询,
PRINT DATEDIFF(YEAR, '05/06/2014', '05/05/2015');
仍然会打印一个而不是零,忽略它仍然短一天才能算作一年的位。 因此我的问题是 SQL 中是否有一个集成函数可以用来实现与 Progress 4GL 相同的结果?
【问题讨论】:
我不知道 SQL 中有任何类似的函数,但你可以做的是使用DATEDIFF(DAY, '05/06/2014', '05/05/2015')
然后将其除以 365。如果差异小于 365 天那么整数除法将返回 0。This link 可能会有所帮助,但看起来我的 ssms 无法识别这些函数。
这是INTERVAL
和DATEDIFF
之间唯一需要解决的区别还是需要在功能上相同?您是否正在将 postgres 转换为 SQL Server?
是的,我正在寻找功能相同的东西?我没有将 Progress 转换为 SQL,而且我试图在 SQL 中找到类似的函数也是不可能的,因为我知道 Progress 4GL 中存在一个。
【参考方案1】:
DATEDIFF 返回两个日期之间跨越的指定边界的数量。这在几天内效果很好,但在几个月和几年内就不太有用了,
下面是在 T-SQL 中计算年龄差异的一种方法,就像在常见的年龄计算中一样。它不是很健壮,但可以完成工作。核心问题是 SQL Server 没有区间数据类型。
--using YYYY-MM-DD date format literal to avoid ambiguity
DECLARE @date1 date = '2014-05-06', @date2 date = '2015-05-05';
--years between 2 dates
SELECT (CAST(CONVERT(char(8), @date2, 112) AS int) - CAST(CONVERT(char(8), @date1, 112) AS int)) / 10000;
【讨论】:
【参考方案2】:一般来说,对于这类问题,您可以计算更细粒度的数字,然后将其解决为更粗略的数字。在这种情况下,您可以计算出两个日期之间的天数,然后除以 365 并将结果取底。
DECLARE @date1 date = '2014-05-06', @date2 date = '2015-05-05';
SELECT FLOOR(DATEDIFF(DAY, @date1, @date2)/365.0)
当然,闰年会带来一些挑战。但大体上是这样的。
【讨论】:
以上是关于是否有与 Progress 4GL INTERVAL 函数等效的 SQL Server 函数?的主要内容,如果未能解决你的问题,请参考以下文章
如何检查XML文件是否存在节点并在Progress4GL中检索值
使用 MATCHES (* + "" + *) 并且 FOR EACH in Progress 4GL 中没有参数是不是相同?