簡體   English   中英

有效日期中的Oracle日期錯誤

[英]Oracle Date Error ON IN valid Month

我的查詢

SELECT POSSESSION.*,PLOT.*,SCHEME_BLOCK.BLOCK 
FROM POSSESSION, PLOT, SCHEME_BLOCK 
WHERE POSSESSION.PLOT_ID=PLOT.PLOT_ID AND PLOT.PLOT ='10' 
AND PLOT.BLOCK_ID = SCHEME_BLOCK.BLOCK_ID AND SCHEME_BLOCK.BLOCK_ID='3' 
AND POSSESSION.CREATED_ON between '1420066800' and '1443650400' 

我的PHP代碼如下。

$query = "SELECT " . $_REQUEST['tb'] . ".*,PLOT.*,SCHEME_BLOCK.BLOCK 
FROM " . $_REQUEST['tb'] . ", PLOT, SCHEME_BLOCK WHERE " . $_REQUEST['tb'] . ".PLOT_ID=PLOT.PLOT_ID AND PLOT.PLOT ='" . $_REQUEST['ps'] . "' 
AND PLOT.BLOCK_ID = SCHEME_BLOCK.BLOCK_ID AND SCHEME_BLOCK.BLOCK_ID='" . $_REQUEST['bid'] . "' AND SCHEME_BLOCK.CREATED_ON between '".strtotime(date('d-M-Y', strtotime($_REQUEST['sdate'])))."' and '".strtotime(date('d-M-Y', strtotime($_REQUEST['edate'])))."'";

在插入日期的同時

$CREATED_ON=date("d-M-Y");

錯誤:

ORA-01843: not a valid month
01843. 00000 -  "not a valid month"
*Cause:    
*Action:

請幫幫我...我怎樣才能正確...我正在用php編碼

提前致謝

在'1420066800'和'1443650400'之間的POSSESSION.CREATED_ON

single-quotes值是string ,因此'1443650400'不是DATE 您必須使用TO_DATE和適當的format model將其顯式轉換為DATE。

首先,此代碼看起來像是您不太了解的簡單復制+粘貼:

strtotime(date('d-M-Y', strtotime($_REQUEST['sdate'])))

它實際上是這樣做的:

  1. 拿一個弦
  2. 轉換為時間戳
  3. 轉換為字符串
  4. 再次轉換為時間戳

無論如何,Oracle在DATE列中不理解Unix時間戳。 您必須使用TO_DATE()函數來創建一個正確的日期,並且當然要使用准備好的語句來使其變得理智。 這條線上的東西:

$query = "SELECT ......... 
   AND POSSESSION.CREATED_ON between TO_DATE(:created_from, 'YYYY-MM-DD') 
       and TO_DATE(:created_to, 'YYYY-MM-DD')";

...,參數數組如下所示:

$params = array(
    'created_from' => date('Y-m-d', $created_from_unix_timestamp),
    'created_to' => date('Y-m-d', $created_from_unix_timestamp),
);

... 或這個:

$params = array(
    'created_from' => $created_from_datetime_object->format('Y-m-d')
    'created_to' => $created_to_datetime_object->format('Y-m-d')
);

不過,您必須知道沒有時間的日期默認為00:00:00,所以created_on2014-01-10 01:00:00的行大於2014-01-10

最后但並非最不重要的一點是,將原始外部輸入注入代碼中,如下所示:

"SELECT " . $_REQUEST['tb'] . "...

...是被黑客入侵的電話。 說真的 通常的借口就是這些借口(“稍后再修復”,“僅供內部使用”)。

嘗試重新編寫您的查詢:

$query = "SELECT " . $_REQUEST['tb'] . ".*,PLOT.*,SCHEME_BLOCK.BLOCK 
FROM " . $_REQUEST['tb'] . ", PLOT, SCHEME_BLOCK WHERE " . $_REQUEST['tb'] . ".PLOT_ID=PLOT.PLOT_ID AND PLOT.PLOT ='" . $_REQUEST['ps'] . "' 
AND PLOT.BLOCK_ID = SCHEME_BLOCK.BLOCK_ID AND SCHEME_BLOCK.BLOCK_ID='" . $_REQUEST['bid'] . "' AND TRUNC(SCHEME_BLOCK.CREATED_ON, 'DD/MM/YYYY') between " . "TO_DATE('" . date('d-m-Y', strtotime($_REQUEST['sdate'])) . "', 'DD/MM/YYYY') and TO_DATE('" . date('d-m-Y', strtotime($_REQUEST['edate'])) . "', 'DD/MM/YYYY')";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM