2014-05-22 21 views
1

我希望能够像做在MonetDB中,我怎样才能得到一个整数的日期?

SELECT cast(my_date_col AS int) FROM my_table; 

我想获得它MonetDB内部使用,整即价值,如果你调查了BAT结构,得到了在适当的元素,你会发现代码在MonetDB的GDK中。现在,AFAICT,这个内部价值是自“Epoch”以来的天数,即“0年”的1月1日(因此1月3日的第2年将是366 + 365 + 2 = 732)。

我能实际管理的最好的是

SELECT my_date_col AS int - cast('1-1-1' AS date) - 366 FROM my_table; 

由于MonetDB不会接受“零年”的日期。这是一个很丑陋的黑客,我想做得更好。帮我?

+0

我没有看到任何东西的[monetdb文档](https://www.monetdb.org/Documentation/SQLreference/Temporal),其表明它支持一个划时代的数据类型。你有参考吗? –

+0

@ MikeSherrill'CatRecall':我不确定你的意思。时期(在这种情况下)是您将时间或日期计算为usecs,msecs,或days或whatnot的偏移量的时间点。在传统的UNIX系统上,Epoch是1970年1月1日。 – einpoklum

+0

“Epoch”本质上是一个整数。日期本质上不是*整数,并且不能在标准SQL中转换为整数。你只是想从1970-01-01到my_date_col的天数? –

回答

1

如果您正在尝试获取“my_date_col”和1970-01-01之间的天数,那么在标准SQL中,您只需从另一个中减去该天数。您的平台monetdb似乎支持此语法,但我没有安装它。我在PostgreSQL中编写了这些示例。

select current_date - date '1970-01-01' as num_days; 
 
num_days 
-- 
16213 

检查,通过增加16213天为当前日期(2014年5月23日)的结果。

select cast ((date '1970-01-01' + interval '16213' day) as date) as target_date 
 
target_date 
-- 
2014-05-23 

演员是必要的,因为这样相加的结果是一个时间戳,而不是日期。

就你而言,你需要一个列名而不是“current_date”。所以你正在寻找这方面的东西。

select my_date_col - date '1970-01-01' as num_days 
from your-table-name; 
+0

@einpoklum:也许你应该编辑你的问题,并添加这些细节。我查看了源代码,但我没有看到任何相关的东西。 (这并不意味着很多。) –

+0

@einpoklum:我的意思是在你的问题中包含足够的细节,所以我们*可以看到你*看到了什么。 (我之前没有说清楚。) –

+0

编辑我的问题。 – einpoklum

相关问题