从数据库中不存在的行中检索数据

时间:2014-12-04 09:13:28

标签: php sql sql-server pdo

首先,这是一个很大的系统,但我使用的是一个简单的例子。

代码段:

$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

系统仅在当天有输入价格时生成数据。如果周末或假期数据库中没有数据,在这种情况下,11月1日至2日和8月9日是周末,11月12日是假日。

我想要实现的是在假期或周末时,它会在周末/假日前一天获取价格。对于周末算法,我通过检查当前行的日期是否是星期六获取它,然后它显示另外2行与星期五的数据。问题出现在假期,如果星期六或星期日是本月的第一天,那么就不会显示数据。

期望的结果是:

--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

如果日期存在于数据库中或创建新表,那一定很容易,但最好不要使它成为一个非常大的数据库。我该如何实现这一目标?感谢。

1 个答案:

答案 0 :(得分: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-Server:

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;

现在你得到了日期,剩下的就是一样......