Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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
Sql 月的最后一天加入到第二个表_Sql_Oracle - Fatal编程技术网

Sql 月的最后一天加入到第二个表

Sql 月的最后一天加入到第二个表,sql,oracle,Sql,Oracle,我需要得到上个月的最后一天,然后将其加入到另一个表中,以返回与日期相关的年/月列,但我正在努力实现我想要的 我试过: SELECT b.yrmonth, LAST_DAY(ADD_MONTHS(SYSDATE,-1)) DT FROM dual a INNER JOIN D_DAY b on DT = b.DT 年-月只返回表中的所有内容,而不是仅返回一行,因此任何帮助都将不胜感激 您的查询有效: SELECT b.yrmonth, 'some constant masking

我需要得到上个月的最后一天,然后将其加入到另一个表中,以返回与日期相关的年/月列,但我正在努力实现我想要的

我试过:

SELECT b.yrmonth, LAST_DAY(ADD_MONTHS(SYSDATE,-1)) DT 
FROM dual a
INNER JOIN D_DAY b on DT = b.DT

年-月只返回表中的所有内容,而不是仅返回一行,因此任何帮助都将不胜感激

您的查询有效:

SELECT b.yrmonth,
       'some constant masking b.DT' DT 
FROM   dual a
       INNER JOIN
       D_DAY b
       on ( b.DT = b.DT ) -- Always true
您不需要加入
DUAL
表,并且需要在
WHERE
子句中过滤您的表

如果
DT
date列具有不同的时间分量:

SELECT yrmonth, dt
FROM   D_DAY
WHERE  DT >= TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE,-1)))
AND    DT <  TRUNC(SYSDATE,'MM');

您不需要使用
dual
表联接。您只需在
where
子句中添加条件即可:

select *
from D_DAY b
where TRUNC(b.DT) = TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE,-1)) 

并将
date
(带时间)强制转换为
date
,因为
LAST\u DAY
函数返回
date
(使用时间组件,如果您想检查日期,您需要在之前强制转换它。

可能重复的@a_horse_,名称不重复。OP知道如何获取上个月的最后一天;问题在于加入条件。An会很有帮助。您不需要在
日期
数据类型上使用
to_date
LAST_DAY()
返回一个
日期
数据类型,并且
TO_DATE
接受一个字符串输入,因此Oracle必须隐式地执行
TO_CHAR
并且有效地执行
TO_DATE(TO_CHAR(LAST_DAY(…),NLS_DATE_格式),'DD-MON-YYYY')
。如果用户更改
NLS\u DATE\u FORMAT
会话参数,使其与显式格式模型不匹配(或者当默认的
NLS\u DATE\u FORMAT
可能在国家之间更改时,如果查询在国际上运行),则此操作将失败。我之所以添加此cast,是因为上一天()正在返回时间戳数据类型;如果您尝试检查它,则返回false:
LAST_DAY(ADD_MONTHS(SYSDATE,-1))=to_date('30/09/2017','dd/MM/yyyyy')
它没有返回时间戳-它返回带有时间组件的日期(Oracle
date
数据类型具有年/月/日/小时/分/秒组件)。如果不需要时间成分,则使用
TRUNC
将其截断回午夜。使用
to_DATE
并依赖隐式
to_CHAR
是错误的解决方案。好的,我同意TRUNC更好,但仍然需要转换日期(带时间):)不过,感谢您的解释。
'DD-MON-YYY'
不是
trunc(datetime)
的有效格式模型。它必须是以下格式之一:
select *
from D_DAY b
where TRUNC(b.DT) = TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE,-1))