在Oracle数据库中从年份获取月份和日期

时间:2018-06-20 11:20:20

标签: sql oracle

我正在尝试从用户输入的年份中获取日期和月份。

我使用的查询是:

SELECT trans_date FROM transactions WHERE (SUBSTR(trans_date,4,4) = 'June' AND TO_NUMBER(SUBSTR(trans_date,9,4)) = 2010); 

这不起作用,但是如果我对DUAL表做同样的事情,就可以了。

SELECT SUBSTR('22-June-2018', 4, 4) FROM DUAL;

这是什么问题?

4 个答案:

答案 0 :(得分:3)

您是否考虑过类似to_char()的事情?

SELECT trans_date
FROM transactions
WHERE TO_CHAR(trans_date, 'YYYY-MM') = '2010-06';

或者更好的是,进行适当的日期比较:

WHERE trans_date >= DATE '2010-06-01' AND
      trans_date < DATE '2010-07-01'

这具有查询可以使用trans_date上的索引的优点。

答案 1 :(得分:2)

<?php
     $Partenza = $partenzaSel = $partenzaTArea = $destinazioneSel = 
         $destinazioneTArea = $nPasseggeri = "";
      if (isset($_POST['partenzaSel']) and isset($_POST['partenzaTArea']) and 
        isset($_POST['destinazioneSel']) and isset($_POST['destinazioneTArea']) and 
        isset($_POST['nPasseggeri']) ){
       $partenzaSel = $_POST['partenzaSel'];
       $partenzaTArea = $_POST['partenzaTArea'];
       $destinazioneSel = $_POST['destinazioneSel'];
       $destinazioneTArea = $_POST['destinazioneTArea'];
       $nPasseggeri = $_POST['nPasseggeri'];
       echo $partenzaSel .'--'. $partenzaTArea  .'--'.  $destinazioneSel  .'--'.  
      $destinazioneTArea  .'--'.  $nPasseggeri  .'--'.  "prova";
  }                                                   
 ?>

答案 2 :(得分:1)

  

这是什么问题?

SUBSTR( string_value, start, length )将字符串数据类型作为第一个参数。 '22-June-2018'不是DATE数据类型-它是字符串数据类型(恰好包含我们认为是日期的字符);因此使用SUBSTR( '22-June-2018', 4, 4 )可以按预期工作。

trans_dateDATE数据类型,而不是字符串数据类型。

SUBSTR( trans_date, 4, 4 )

涉及从日期到字符串的隐式转换;这样做是有效的:

SUBSTR( TO_CHAR( trans_date ), 4, 4 )

因为,TO_CHAR( date_value, format_model )需要知道如何将DATE格式化为字符串,如果您不提供第二个参数,则它将使用NLS_DATE_FORMAT会话参数,并且表达式为有效地:

SUBSTR(
  TO_CHAR(
    trans_date
    ( SELECT value FROM nls_session_parameters WHERE parameter = 'NLS_DATE_FORMAT' )
  ),
  4,
  4
)

如果NLS_DATE_FORMAT会话参数与DD-Month-YYYY不匹配(或等同于第4-7个字符是月份(仅用于4个字符的月份名称)和第9-12个字符的等效项是年份(同样,只有4个字符的名称,这才适用于月份),则您的查询将无效。

  

我正在尝试从用户输入的年份中获取日期和月份。

使用EXTRACT

SELECT trans_date
FROM   transactions
WHERE  EXTRACT( MONTH FROM trans_date ) = 6
AND    EXTRACT( YEAR  FROM trans_date ) = 2010

使用TO_CHAR( date_value, format_model )

SELECT trans_date
FROM   transactions
WHERE  TO_CHAR( trans_date, 'Month' ) = 'June'
AND    TO_CHAR( trans_date, 'year'  ) = '2010'

使用日期文字:

SELECT trans_date
FROM   transactions
WHERE  trans_date >= DATE '2010-06-01'
AND    trans_date < ADD_MONTHS( DATE '2010-06-01', 1 );

使用TRUNC( date_value, 'MM' )

SELECT trans_date
FROM   transactions
WHERE  TRUNC( trans_date, 'MM' ) = DATE '2010-06-01';

答案 3 :(得分:-1)

你可以像这样使用

WHERE TO_CHAR(date_column_name,'MM-YYYY')='06-2010'