2014-12-04 102 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

相关问题