【问题标题】:Saving academic year to MySQL database based on now() timestamp?根据 now() 时间戳将学年保存到 MySQL 数据库?
【发布时间】:2015-12-03 09:59:19
【问题描述】:

我正在经营一家大学服务台办公室,员工使用 php 表单在 MySQL 数据库中注册他们回答的查询。

基本上表单会创建一些值,这些值在 php 中存储为变量,然后保存在数据库中,如下所示:

$employeename = $_POST['employeename'];
$medium = $_POST['medium'];
$timespent = $_POST['timespent'];

$query = "INSERT INTO queries VALUES ('',now(),'$employeename','$medium','$timespent')";
mysqli_query($con,$query);

这给了我以下表格结构:

id | timestamp            | employeename | medium | timespent
 1 | 2015-11-30 10:52:57  | Jennifer     | e-mail | 5
 2 | 2015-11-30 10:55:02  | Jason        | phone  | 2

我想在我的 MySQL 数据库中添加一个列,用于存储保存每个查询的学年,因为在计算保存的查询数量时我将经常使用此分组。

我们的学年是 2013/2014、2014/2015、2015/2016 等。每个学年涵盖从 9 月 1 日到 8 月 31 日的期间,这意味着例如时间戳从 2015-09-01 00:00:00 到但不包括 2016-09-01 00:00:00 的所有查询都应在数据库的我的学年列中保存“2015/2016”。

我正在寻找 PHP 代码,我需要将我的 MySQL 查询中的“now()”解释为正确的学年,并将其保存到我的数据库中,最好以不需要添加以前的方式/即将学年添加到我的代码中(即,如果用户在 2020 年 9 月 1 日保存查询,脚本会自动知道将学年保存为 2020/2021)。

任何帮助将不胜感激。很抱歉没有包含任何示例代码。原因是我不知道该怎么做,因此不确定要读什么。

【问题讨论】:

  • 使用 PHP 的 datetime 类会更容易,而不是基于NOW()
  • 在解释时间戳后,我是否只需要创建一个变量并执行另一个插入查询:$timestampfromdb = mysqli_insert_timestamp($con);
  • 不需要添加列,选择时可以在sql中用year(timestamp)导出该字段
  • 我不介意这样做,但我担心当我的数据库中回答了 100,000 多个查询时它会减慢查询速度。我还假设将时间戳转换为学年的 php 代码会非常相似?
  • 只需将NOW() 存储在数据库的时间戳列中。添加特定选择标准的时间是在您编写选择要处理的数据的查询时。这样,您就不会受限于可以在查询中选择的内容。例如,如果您只想知道 2014/2015 学年第一学期发生了什么,您的方式是不允许的

标签: php mysql


【解决方案1】:

您可以在 MySQL 中使用以下公式:

 CONCAT(
    @a:=IF(MONTH(NOW())<9,YEAR(NOW())-1,YEAR(NOW())),
    "/",
    @a+1) year 

这会根据月份估计当前学年的第一年,然后使用变量连接第二年。

【讨论】:

  • 这个查询很棒!添加 DISTINCT 给了我现在可以用来填充下拉列表的值。
  • 这个查询在 phpmyadmin 中作为一个查询可以正常工作,但在我的 php 脚本上不起作用:$academicyear = "SELECT DISTINCT(CONCAT(@a:=IF(MONTH(timestamp)&lt;9,YEAR(timestamp)-1,YEAR(timestamp)),"/",@a+1)) AS theacademicyear FROM queries"; 我得到一个除以零的警告。知道有什么问题吗?编辑:发现,只需将双“替换为单”。
  • 你必须将斜杠附近的双引号替换为单引号
【解决方案2】:

或者简单地添加一个新的 Field 女巫为你做这件事。如果您使用 PERSITENT 类型,您还可以在其上设置一个 INDEX。

ALTER TABLE queries
ADD COLUMN `ayear` VARCHAR(10) AS (
  IF( `timestamp`  >= DATE_FORMAT(`timestamp` , '%Y-09-01 00:00:00') ,
    CONCAT( YEAR( `timestamp` ),'/',YEAR( `timestamp` )+1) ,
    CONCAT( YEAR( `timestamp` )-1,'/',YEAR( `timestamp` ))
  )
)  PERSISTENT;

这里是 Result 和 CREATE TABLE:

MariaDB [test]> select * from queries;
+----+---------------------+-----------+
| id | timestamp           | ayear     |
+----+---------------------+-----------+
|  1 | 2015-12-01 00:00:00 | 2015/2016 |
+----+---------------------+-----------+
1 row in set (0.00 sec)

MariaDB [test]> INSERT INTO `queries` (`id`, `timestamp`) VALUES (2, '2015-08-01 00:00:00');
Query OK, 1 row affected (0.00 sec)

MariaDB [test]> INSERT INTO `queries` (`id`, `timestamp`) VALUES (3, '2015-08-31 12:00:00');
Query OK, 1 row affected (0.01 sec)

MariaDB [test]> INSERT INTO `queries` (`id`, `timestamp`) VALUES (4, '2015-09-15 15:00:00');
Query OK, 1 row affected (0.00 sec)

MariaDB [test]> select * from queries;
+----+---------------------+-----------+
| id | timestamp           | ayear     |
+----+---------------------+-----------+
|  1 | 2015-12-01 00:00:00 | 2015/2016 |
|  2 | 2015-08-01 00:00:00 | 2014/2015 |
|  3 | 2015-08-31 12:00:00 | 2014/2015 |
|  4 | 2015-09-15 15:00:00 | 2015/2016 |
+----+---------------------+-----------+
4 rows in set (0.00 sec)

MariaDB [test]>

CREATE TABLE `queries` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `timestamp` timestamp NULL DEFAULT NULL,
  `ayear` varchar(10) AS (
  IF( timestamp  >= DATE_FORMAT(timestamp , '%Y-09-01 00:00:00') ,
    CONCAT( YEAR( timestamp ),'/',YEAR( timestamp )+1) ,
    CONCAT( YEAR( timestamp )-1,'/',YEAR( timestamp ))
  )) PERSISTENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

【讨论】:

  • 我理解这会让我的数据库在 php 之外解释日期是否正确?听起来是一个非常好的解决方案。但是当我尝试在 phpMyAdmin 中运行您的查询时,我得到一个语法错误。
  • 对不起,如果已经测试过。在我的系统中没问题。您只能将字段名时间戳放在反引号中,例如 timestamp 。时间戳是保留的
  • 如果在我的回答中有更改
【解决方案3】:

Carbon 具有提供时间戳的功能,即现在之前的几天、几个月、几年。 假设你有这个学年:

$thisyear->carbon:now();

和上一年

$preyear->carbon:now()->subYears(1);

然后将这两个都传递给字符串并作为范围粘贴到Mysql。

【讨论】:

  • 他说他用的是碳吗?无论如何,这对您无法在原始 PHP 中进行编码没有任何作用。
  • 建议不要使用碳。
  • 就建议而言,它有点敲碎坚果
猜你喜欢
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
  • 2013-05-03
  • 1970-01-01
相关资源
最近更新 更多