首先,这是一个很大的系统,但我使用的是一个简单的例子。
代码段:
$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
如果日期存在于数据库中或创建新表,那一定很容易,但最好不要使它成为一个非常大的数据库。我该如何实现这一目标?感谢。
答案 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;
现在你得到了日期,剩下的就是一样......