【问题标题】:Retrieve data from non-existent rows in database从数据库中不存在的行中检索数据
【发布时间】:2014-12-04 09:13:27
【问题描述】:

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

代码sn-p:

$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

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

【问题讨论】:

  • 为什么不用 PHP 实现逻辑而不是尝试在 SQL 中实现呢?即请求的日期范围是xyz - 所以您首先检查该日期范围是周末还是假日,然后根据前一个日期更改日期范围,然后运行您的查询?
  • @Latheesan 你能提供一个例子吗?对于周末,我想我可以检查星期日是在每月的 1 号还是 2 号,然后我会重新查询 strtotime -2 天和 -3 天的价格,但我不知道如何查看假期

标签: php sql sql-server pdo


【解决方案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;

现在你得到了日期,其余的都是一样的......

【讨论】:

  • 'IFNULL' is not a recognized built-in function name. 很抱歉我忘了告诉它是 SQL Server。
  • 尝试使用ISNULL 而不是IFNULL 来获得SQL Server。还将问题标记为sql-server 而不是mysql!
  • 标签已编辑。 Msg 137, Level 15, State 2, Line 3 Must declare the scalar variable "@rowid".Msg 102, Level 15, State 1, Line 4 Incorrect syntax near ':'.
  • 哦...第一个动态日期生成部分需要为sql-server 编辑...! :(
猜你喜欢
  • 2021-10-28
  • 2015-04-26
  • 2012-06-02
  • 2019-11-19
  • 1970-01-01
  • 2016-02-09
相关资源
最近更新 更多