2014-12-04 98 views
3

首先,這是一個很大的系統,但是我使用一個簡單的例子。從數據庫中不存在的行中檢索數據

的代碼片斷:

$query = "select * from table where date between '2014-11-01' and '2014-11-13'"; 
$stmt = $con->prepare($query); 
$stmt->execute(); 
$rows = $stmt->fetchAll(); 
$num = count($rows); 
if($num>0){ 
    foreach ($rows as $row) { 
    echo date('d-m-Y', strtotime($row['Date'])); 
    echo $row['code']; 
    echo number_format($row['price'], 0, ",", "."); 
    } 

我的查詢的結果,從11月1日的數據取到11月13日

date | code | price 
2014-11-03 | 'abc' | 140 
2014-11-04 | 'abc' | 110 
2014-11-05 | 'abc' | 85 
2014-11-06 | 'abc' | 100 
2014-11-07 | 'abc' | 120 
2014-11-10 | 'abc' | 85 
2014-11-11 | 'abc' | 97 
2014-11-13 | 'abc' | 100 

只有當有當天輸入價格的系統產生的數據。如果週末或假期沒有數據庫中的數據,則在這種情況下,Nov 1-2和8-9是週末,而11月12日是假期。

我想達到的是假期或週末時,它會以週末/假日前一天的價格收取價格。對於週末算法,我通過檢查當前行的日期是星期六來獲取它,然後再顯示星期五的數據。問題出現在假期時,如果星期六或星期日是本月的第一天,則不會顯示數據。

期望的結果是:

--if the price on 2014-10-31 is 90 
    date | code | price 
2014-11-01 | 'abc' | 90 
2014-11-02 | 'abc' | 90 
2014-11-03 | 'abc' | 140 
2014-11-04 | 'abc' | 110 
2014-11-05 | 'abc' | 85 
2014-11-06 | 'abc' | 100 
2014-11-07 | 'abc' | 120 
2014-11-08 | 'abc' | 120 
2014-11-09 | 'abc' | 120 
2014-11-10 | 'abc' | 85 
2014-11-11 | 'abc' | 97 
2014-11-12 | 'abc' | 97 
2014-11-13 | 'abc' | 100 

如果在數據庫中存在的日期或創建一個新表,但最好不要使這是一個非常大的數據庫必須方便。我如何實現這一目標?謝謝。

+2

你爲什麼不實現在PHP中的邏輯,而不是試圖做它在SQL?即請求的日期範圍是'xyz' - 因此您首先檢查該日期範圍是週末還是假日,然後將日期範圍相應地更改爲前一日期,然後運行查詢? – Latheesan 2014-12-04 09:23:19

+0

@Latheesan你能舉個例子嗎?對於週末我想我可以檢查一下星期日是否在本月的第一或第二天,然後我會重新查詢價格以確定-2天和-3天,但我不知道如何檢查假期 – anon3776 2014-12-04 09:32:50

回答

1

這應該做你想做的。

SELECT cur_date, IFNULL(code, 'abc'), IFNULL(price,'any_price') FROM 
(
    SELECT @rowid:=date_add(@rowid, interval 1 day) as cur_date 
    FROM `table`, (SELECT @rowid:='2014-10-31') as init 
    WHERE @rowid < '2014-11-13' 
) TBL_DATE LEFT JOIN 
(
    select `Date`, `code`, `price` 
    from `table` 
    where `date` between '2014-11-01' and '2014-11-13' 
) TBL_MAIN ON TBL_DATE.cur_date = TBL_MAIN.`Date` 

對於SQL-服務器:

DECLARE @start DATE, @end DATE; 
SELECT @start = '20141101', @end = '20141113'; 

;WITH n AS 
(
    SELECT TOP (DATEDIFF(DAY, @start, @end) + 1) 
    n = ROW_NUMBER() OVER (ORDER BY [object_id]) 
    FROM sys.all_objects 
) 

SELECT DATEADD(DAY, n-1, @start) as cur_date 
FROM n; 

現在你得到的日期,其餘是一樣的...

+0

'' IFNULL'不是公認的內置函數名稱。「對不起,我忘了告訴它是SQL Server。 – anon3776 2014-12-04 09:41:54

+0

爲'SQL Server'嘗試'ISNULL'而不是'IFNULL'。還要將問題標記爲'sql-server'不是mysql! – Riad 2014-12-04 09:46:58

+1

標籤已編輯。 '消息137,級別15,狀態2,行3必須聲明標量變量「@rowid」。'Msg 102,Level 15,State 1,Line 4''附近語法不正確'' – anon3776 2014-12-04 09:52:28