在sql查询中管理小时数和数据

5gfr0r5j  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(332)

我打算用php学习一个小的webapp。我面临一个有关要执行的sql查询的问题。基本上我必须根据日期和时间来管理预订。我用一个type=date和一个type=time的形式将这两件事分开。
日期是“数据”。
时间是“奥拉里奥·伊日尼奥”。
这是我的表格:

Data: <br><input type="date" name="data"  ><br>
Orario Inizio: <br><input type="time" name="orario_inizio" min="09:30:00" max="16:30:00"><br>
Orario Fine: <br><input type="time" name="orario_fine" min="10:00:00" max="18:30:00"><br>

为了在数据库中输入预订,我们必须在“orarioèu inizio”中留出两个小时的空间,即在接下来的两个小时内没有其他预订。
输入.php

// Richiedente
$nominativo = $_POST['nominativo'];

$email = $_POST['email'];
$oggetto = $_POST['oggetto'];
$data = $_POST['data'];
$orario_inizio = $_POST['orario_inizio'];
$orario_fine = $_POST['orario_fine'];

//inserting data order

$query1 = "INSERT INTO Prenotazione (nominativo,email,data,orario_inizio,orario_fine,oggetto,nominativoi,emaili,nominativoe,emaile) VALUES ('$nominativo','$email','$data','$orario_inizio','$orario_fine','$oggetto','$nominativoi','$emaili','$nominativoe','$emaile')"; $result1 = mysqli_query($conn, $query1 ); 
$result1 = mysqli_query($conn, $query1 ); 
?>

我不能理解的是如何开发一个查询,允许我考虑用户选择的日期,即两小时内没有预订。让我用一个例子来解释:user1想要预订每天9月24日上午10:30的房间。我必须确保12:30之前没有预订。如果没有其他预订,那么如果我发送通知,我想输入此预订。
我已经做了第二部分,插入数据库,但是我不知道如何做第一次检查。

$query1 = "INSERT INTO Prenotazione (nominativo,email,data,orario_inizio,orario_fine,oggetto,nominativoi,emaili,nominativoe,emaile) VALUES ('$nominativo','$email','$data','$orario_inizio','$orario_fine','$oggetto','$nominativoi','$emaili','$nominativoe','$emaile')";

我已经读到一种可能性应该是使用subdate
你能帮助我吗?谢谢您
更新。
表prenotazione
数据库

v6ylcynt

v6ylcynt1#

因为您没有提供表架构,所以我必须使用占位符列名等。
如前面的注解所述,您可以使用mysql函数 BETWEEN 看看是否有东西在给定的时间之间(也适用于日期)。它的作用是返回一个布尔值。如果为真,则为1;如果为假,则为0。
假设您的表有一个日期行,以便查看特定日期的预订,您可以编写以下示例:

$sql="SELECT
        COUNT(column_id)
      FROM
        table_name
      WHERE 
        TIME($orario_inizio) BETWEEN '10:30' AND '12:30'
        AND date_column=CURDATE()";
$result_set=mysqli_query($conn, $sql);
$checkIfValid=mysqli_fetch_array($conn, $result_set)[0];

if($checkIfValid > 0) {
    //throw error
}
else {
    //perform insert query
}

你可以调整逻辑,让它更符合你的喜好。例如, CURDATE() 只需要当前日期,但也许您有一个特定的预订日期,您可以使用?
这个sql基本上是根据时间在上午10:30到12:30之间,并且日期是今天(可以是给定的预订日期)来计算您选择的id(用户id或诸如此类)。
现在,如果这个sql找到任何记录,它将被放入计数中。所以它的值不是0就是更高。如果计数大于0,则表示我们正忙,或者应用了逻辑,这意味着您无法预订该天/时间段,因此我们将抛出一个错误。但是,如果计数不大于0,则继续 INSERT 因为那时一切都会好起来的。

b09cbbtk

b09cbbtk2#

考虑以下几点:

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table(booking_id SERIAL PRIMARY KEY,booking_start INT NOT NULL);

INSERT INTO my_table (booking_start) VALUES (3),(7),(10);

SET @n = 9;

INSERT INTO my_table (booking_start)
SELECT @n
  FROM (SELECT 1) x
  LEFT
  JOIN my_table y
    ON y.booking_start BETWEEN @n AND @n+2
 WHERE y.booking_start IS NULL
 LIMIT 1;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

SELECT * FROM my_table;
+------------+---------------+
| booking_id | booking_start |
+------------+---------------+
|          1 |             3 |
|          2 |             7 |
|          3 |            10 |
+------------+---------------+
3 rows in set (0.00 sec)

-- Nothing happens, because 10 is between 9 and 11.

SET @n = 8;

INSERT INTO my_table (booking_start)
SELECT @n
  FROM (SELECT 1) x
  LEFT
  JOIN my_table y
    ON y.booking_start BETWEEN @n AND @n+2
 WHERE y.booking_start IS NULL
 LIMIT 1;

SELECT * FROM my_table;
+------------+---------------+
| booking_id | booking_start |
+------------+---------------+
|          1 |             3 |
|          2 |             7 |
|          3 |            10 |
+------------+---------------+
3 rows in set (0.00 sec)

-- Nothing happens, because 10 is between 8 and 10.

SET @n = 7;

INSERT INTO my_table (booking_start)
SELECT @n
  FROM (SELECT 1) x
  LEFT
  JOIN my_table y
    ON y.booking_start BETWEEN @n AND @n+2
 WHERE y.booking_start IS NULL
 LIMIT 1;

SELECT * FROM my_table;
+------------+---------------+
| booking_id | booking_start |
+------------+---------------+
|          1 |             3 |
|          2 |             7 |
|          3 |            10 |
+------------+---------------+
3 rows in set (0.00 sec)

-- Nothing happens, because 7 is between 7 and 9.

SET @n = 4;

INSERT INTO my_table (booking_start)
SELECT @n
  FROM (SELECT 1) x
  LEFT
  JOIN my_table y
    ON y.booking_start BETWEEN @n AND @n+2
 WHERE y.booking_start IS NULL
 LIMIT 1;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

SELECT * FROM my_table;
+------------+---------------+
| booking_id | booking_start |
+------------+---------------+
|          1 |             3 |
|          2 |             7 |
|          3 |            10 |
|          4 |             4 |
+------------+---------------+
4 rows in set (0.00 sec)

-- Success, because there is no value between 4 and 6.

相关问题