如何使用Netezza将日期时间转换为日期

4

我正在进行一些计算,但是由于我的日期字段显示的是时间戳,我只想在进行计算时使用日期。如何忽略分钟并在进行计算时仅使用日期?这是我的代码:

SELECT EF.DSCH_TS,
       CASE WHEN EXTRACT (DAY FROM  EF.DSCH_TS - EF.ADMT_TS)>=0 THEN 'GroupA' END AS CAL
FROM MainTable EF;
3个回答

4
Netezza内置了这个功能,只需简单地使用:
SELECT DATE(STATUS_DATE) AS DATE,
       COUNT(*) AS NUMBER_OF_             
FROM X
GROUP BY DATE(STATUS_DATE)
ORDER BY DATE(STATUS_DATE) ASC

这将仅返回时间戳的日期部分,比使用TO_CHAR()将其转换为字符串更有用,因为它将在GROUP BYHAVING和其他Netezza日期函数中工作(而TO_CHAR方法不会)。
此外,DATE_TRUNC()函数将从时间戳中提取特定值(“天”、“月”、“年”等),但不能超过一个值,除非使用多个函数并进行串联。 DATE()是这个问题的完美简单答案,我很惊讶在Stack上看到这么多误导性的答案。我经常看到TO_DATE,这是Oracle的函数,但在Netezza上无法使用。
假设您的查询只对两个时间戳之间的午夜到午夜之间的天数感兴趣,则如下所示:
SELECT EF.DSCH_TS,
  CASE
    WHEN EXTRACT (DAY FROM (DATE(EF.DSCH_TS) - DATE(EF.ADMT_TS)))>=0 THEN 'GroupA'
  END AS CAL
FROM MainTable EF;

@moe 这应该被标记为问题的答案。将时间戳转换为日期会删除字段的所有时间细节,这正是问题标题要做的事情。 - dlamblin

2
你可能想考虑重新编写你的案例语句,以返回一个间隔。这将允许更多的灵活性。
        SELECT EF.DSCH_TS,
    CASE 
WHEN  age(date(EF.DSCH_TS),date(EF.ADMT_TS))>= interval '6 days' 
    THEN 'GroupA' END AS CAL
        FROM MainTable EF;

0

使用 date_trunc() 函数,第一个参数为 'day'。我认为这就是你想要的:

SELECT EF.DSCH_TS,
       (case when date_trunc('day', EF.DSCH_TS) >= date_trunc('day', EF.ADMT_TS) THEN 'GroupA' END) AS CAL
FROM MainTable EF;

我遇到了错误:函数'DATE_TRUNC(TIMESTAMP)'不存在。 - moe
@moe...我在第二次调用中忘记了第一个参数。 - Gordon Linoff
谢谢Gordon,这个方法很有效,但是我对这个函数有点困惑。如果我想要修改条件,使其像这样:EF.DSCH_TS > 6,我该怎么做呢?因为我想测试当天数大于0或1、2、3等时的情况,所以我有很多case语句在这里没有展示。感谢您的澄清... - moe
我认为你应该将 date_trunc() 调用放在 extract(day from . . .) 中。 - Gordon Linoff
你能展示一下如何做吗?因为我做不对。谢谢。 - moe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接