Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在oracle sql中获取从第一个月到当前日期的数据_Sql_Oracle_Datetime_Date Comparison_Sysdate - Fatal编程技术网

在oracle sql中获取从第一个月到当前日期的数据

在oracle sql中获取从第一个月到当前日期的数据,sql,oracle,datetime,date-comparison,sysdate,Sql,Oracle,Datetime,Date Comparison,Sysdate,我在下面写了一个查询,这个查询运行良好,它在过去的一周内每次都会获取数据 select t.day_id from F_TIME t where t.day_id >= TO_NUMBER (TO_CHAR( TRUNC ( SYSDATE , ''IW'' ) - 7 , ''YYYYMMDD'' )) and t.day_id < TO_NUMBER ( TO_CHAR ( TRUNC ( SYSDATE

我在下面写了一个查询,这个查询运行良好,它在过去的一周内每次都会获取数据

    select t.day_id 
    from F_TIME t 
    where t.day_id >= TO_NUMBER (TO_CHAR( TRUNC ( SYSDATE , ''IW'' ) - 7 , ''YYYYMMDD'' )) 
                      and t.day_id <  TO_NUMBER ( TO_CHAR ( TRUNC ( SYSDATE , ''IW'' ), ''YYYYMMDD'' ))
选择t.day\u id
从F_时间t
其中t.day_id>=TO_编号(TO_字符(TRUNC(SYSDATE,'IW')-7,'YYYYMMDD'))
和t.day_id
但现在我想重写这个查询,使它总是从月1日开始直到sysdate为止获取数据。例如,如果我现在运行这个查询,我应该得到2018年1月1日到2018年1月11日的数据

如果我在2月1日运行此查询,那么它将返回整个1月份的数据。我不确定是否可以在单个查询中执行此操作


dayid是数字数据类型,格式为20170815,我只熟悉MS SQL,对Oracle了解不多。如果我必须在MS SQL中这样做,我最终会将今天的日期作为文本处理,并根据需要修改

下面是一个与MS SQL兼容的示例。很抱歉,我不得不让您将其转换为Oracle,但希望这个想法是有意义的,并且Oracle中有等效的函数

select CONCAT(DATEPART(month, GETDATE()),'/1/', DATEPART(year, GETDATE()))
下面是一个如何使用它的示例:

select * from MyTable
where timestamp > CONCAT(DATEPART(month, GETDATE()),'/1/', DATEPART(year, GETDATE()))

我只熟悉MS SQL,对Oracle了解不多。如果我必须在MS SQL中这样做,我最终会将今天的日期作为文本处理,并根据需要修改

下面是一个与MS SQL兼容的示例。很抱歉,我不得不让您将其转换为Oracle,但希望这个想法是有意义的,并且Oracle中有等效的函数

select CONCAT(DATEPART(month, GETDATE()),'/1/', DATEPART(year, GETDATE()))
下面是一个如何使用它的示例:

select * from MyTable
where timestamp > CONCAT(DATEPART(month, GETDATE()),'/1/', DATEPART(year, GETDATE()))

对于id为
yyyyymmdd
格式的日期,您可以使用以下内容:

   select day_id                  
     from F_TIME
    where to_date(day_id,'yyyymmdd') between to_date(to_char(sysdate,'yyyymm')||'01','yyyymmdd') and trunc(sysdate)
    order by to_date(day_id,'yyyymmdd') 

即使day_id是数字格式(不是字符串),上面的sql也可以工作,为此,您可以查看以下内容:


对于id为
yyyyymmdd
的日期,您可以使用以下格式:

   select day_id                  
     from F_TIME
    where to_date(day_id,'yyyymmdd') between to_date(to_char(sysdate,'yyyymm')||'01','yyyymmdd') and trunc(sysdate)
    order by to_date(day_id,'yyyymmdd') 

即使day_id是数字格式(不是字符串),上面的sql也可以工作,为此,您可以查看以下内容:


在Oracle中,表达式
TRUNC(datestamp,'MM')
将任何日期时间表达式在其月份的第一天变为午夜

如果您有日期戳,您的日期选择逻辑将如下所示

 WHERE datestamp >= TRUNC(SYSDATE, 'MM')
给你本月的一切

这会让你在前一个月拥有一切

WHERE datestamp >= ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -1)
  AND datestamp <  TRUNC(SYSDATE, 'MM')

Pro提示:尽可能使用DBMS提供的日期时间数据类型。正如您所见,使用这些数据类型的查询比其他可能的查询更易于阅读和使用。

在Oracle中,表达式
TRUNC(datestamp,'MM')
将任何日期时间表达式在其月份的第一天变为午夜

如果您有日期戳,您的日期选择逻辑将如下所示

 WHERE datestamp >= TRUNC(SYSDATE, 'MM')
给你本月的一切

这会让你在前一个月拥有一切

WHERE datestamp >= ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -1)
  AND datestamp <  TRUNC(SYSDATE, 'MM')

Pro提示:尽可能使用DBMS提供的日期时间数据类型。正如您所见,使用这些数据类型的查询比其他可能的查询更易于阅读和使用。

要获取当月的第一天,您只需将第一个
TRUNC(SYSDATE,'IW')
转换为
TRUNC(SYSDATE,'MM')
,如果希望在当前月份的第一天运行上一个月的数据,请将
-7
转到
-1

然后您希望在sysdate之前获取数据,因此再次在
TRUNC(sysdate)
中打开第二个
TRUNC(sysdate,'IW')

选择t.day\u id
从F_时间t
其中t.day_id>=TO_NUMBER(TO_CHAR(TRUNC(SYSDATE-1,'MM'),'YYYYMMDD'))

和t.day_id要获取本月的第一天,您只需将第一个
TRUNC(SYSDATE,'IW')
转换为
TRUNC(SYSDATE,'MM')
,如果希望在本月的第一天运行,则将
-7
转换为
-1

然后您希望在sysdate之前获取数据,因此再次在
TRUNC(sysdate)
中打开第二个
TRUNC(sysdate,'IW')

选择t.day\u id
从F_时间t
其中t.day_id>=TO_NUMBER(TO_CHAR(TRUNC(SYSDATE-1,'MM'),'YYYYMMDD'))


和t.day\u id您能提供样本数据的cte吗?day\u id的数据类型是什么?日期、字符串、数字?答案各不相同。day_id为数字数据类型,数据存储格式为20040501请您的问题更具体地指定所需的日期范围。如果您在
2018-01-11
上运行查询,应包括的第一个和最后一个日期是什么?如果您在
2018-03-30
上运行查询,应该包括哪些日期(最后一个是一个技巧性问题)。您可以提供样本数据的cte吗?日期id是什么数据类型?日期、字符串、数字?答案各不相同。day_id为数字数据类型,数据存储格式为20040501请您的问题更具体地指定所需的日期范围。如果您在
2018-01-11
上运行查询,应包括的第一个和最后一个日期是什么?如果您在
2018-03-30
上运行查询,那么应该包括哪些日期(最后一个是一个技巧性问题)。但是我如何在表查询中使用此示例。看起来有点复杂day_id的值是什么?它的格式类似于20170815..我只是运行了你的查询,返回了太多的日期。并且不能将查询限制在where子句而不是select子句中。因为我想在很多地方使用这个逻辑来比较返回空值的元素,我们不能在where子句而不是select子句中写入逻辑吗?即使我得到的数据从一个月的第一天开始到当前日期,那么也可以。我得到的错误是ORA-01840:输入值不够长,不适合日期格式。请注意,day_id是数字数据类型,其格式为例如20170815,但如何在中使用此示例