2015-12-03 73 views
0

我正在运行一个大学帮助台办公室,员工使用php表单来注册他们在MySQL数据库中已经回答的查询。基于now()时间戳将学年保存到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)。

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

+0

这将是更容易使用PHP的日期时间类,而不是使其基于'NOW()' – Daan

+0

难道我只是需要在解释时间戳后创建一个变量并执行另一个插入查询:$ timestampfromdb = mysqli_insert_timestamp($ con); – Morten

+0

无需添加列,您可以在选择 – amdixon

回答

1

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

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

该估计根据当月本学年的第一年,然后再使用可变串联的第二年。

+0

这个查询太棒了!添加DISTINCT可为我提供我现在可用来填充下拉列表的值。 – Morten

+0

这个查询在phpmyadmin中的查询工作正常,但在我的php脚本中无效:'$ academicyear =“SELECT DISTINCT(CONCAT(@a:= IF(MONTH(timestamp)<9,YEAR(timestamp)-1, YEAR(timestamp)),“/”,@ a + 1))ASacademicyear FROM queries“;'我得到一个除零警告。任何想法有什么不对?编辑:发现了,只需要替换双“与单” – Morten

+0

你必须将斜杠附近的双引号替换为简单的引号 – Adam

-1

碳具有功能给时间戳,是现在的几天,几个月,几年。 说你有这个学年为:

$thisyear->carbon:now(); 

与上年

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

那么这两种传递给串并粘贴到MySQL作为一个范围。

+0

他说他在用碳吗?无论如何,你都无法用原始PHP进行编码。 – RiggsFolly

+0

没有碳是一个建议。 – MRF

+0

它有点__HAMMER破解螺母_尽可能建议去 – RiggsFolly

0

或者添加一个新的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; 

这里的结果和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; 
+0

我的理解是,这将使我的数据库做解释日期之外的PHP ?听起来像是一个非常好的解决方案,但是当我尝试在phpMyAdmin中运行查询语句时出现语法错误 – Morten

+0

对不起,如果在我的系统中测试过了,那么你只能将字段名时间戳写入''timestamp '。timestamp是保留的 –

+0

如果在我的回答中有改变 –