2015-12-03 74 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

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