2016-11-10 2 views
1

У меня проблема, когда, я думаю, существует пара решений.MSSQL datetime datetime в php

сценарий Я построил эту интрасети, где внутренние рабочие показатели KPI видны для офиса. Данные извлекаются из базы данных MSSQL и отображаются на веб-странице в сочетании с PHP, чем данные, и преобразуются в массив, поэтому API диаграммы Google может создавать красивые диаграммы. До сих пор так хорошо!

проблема У меня есть диаграмма, на которой показаны созданные билеты за последние 7 дней (в обратном порядке). Количество билетов создается по счету MSSQL, по одному числу на каждый день (сегодня - 7).

Но в некоторые дни билеты не создаются, как праздник или воскресенье. То, где все идет не так.

Сегодня четверг, и это показывает:

Day   Amount 
Thursday  25 
Friday  10 
Monday  30 (etc) 
Tuesday  15 (day before) 
Wednesday 20 (yesterday) 
Thursday  50 (today) 

вместо

Saturday  0 
Sunday  0 
Monday  30 
Tuesday  15 
Wednesday 20 
Thursday  50 

Проблема заключается в том, что есть нет записей (билеты) с создания современных на субботу или воскресенье, поэтому MSSQL cant посчитайте их.

PHP вычисляет даты (также сегодня -7), которые показаны под осью в моей диаграмме, но PHP включает Saterday и Sunday, поэтому названия осей не являются представлениями для данных, которые показывает ось.

Возможное решение Одним из решений является то, что каким-то образом MSSQL показывает Saterday и Sunday в таблице результатов. Но я не думаю, что это возможно, потому что записей просто нет.

Другое решение Получить DateTime, используемый в запросе MSSQL и разобрать их на мой intranetpage так диаграммы Google может отображать эти даты вместо PHP созданы даты. Но чем я получаю ошибку «Преобразовать datetime class в строку».

Поскольку datetime в MSSQL является типом datetime, а не типом varchar. После многих попыток поиска и поиска еще в google и stackoverflow, я могу succesfull конвертировать datetime в varchar. Но чем часть, где я беру сегодняшнюю дату и возвращаюсь на 7 дней, больше не работает.

Мой PHP (и запрос) выглядят следующим образом:


$sql = "                 

SELECT top 7 
    CAST(bb_casestartingtime AS DATE) AS DATE, COUNT(*) as TotalRows   
FROM 
    CRM_MSCRM.dbo.FilteredIncident  
WHERE 
    bb_casestartingtime > (CONVERT(date, GETDATE() - 7)) 
GROUP BY CAST(bb_casestartingtime AS DATE) 
Order by date 

"; 

$stmt = sqlsrv_query($conn, $sql);          
if($stmt === false) {die(print_r(sqlsrv_errors(), true));} 

$x=5; 
while($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) 

    { **$dateValue = date("Y-m-d", strtotime(" -$x day"));** 
     echo "[',".$row[**date**].$row['TotalRows'].",],"; 
     $x--; 
    } 

Я сломал два куска кода в два раза, но на самом деле они

В таблице (по крайней мере, интересная часть):

case id bb_casestartingtime 
01  2016-11-10 15:30:45.000 
02  2016-11-10 16:22:10.000 
03  2016-11-09 15:02:15.000 

Я подсчитываю количество вхождений по дате (bb_casestartingtime) в общей сложности. Так что сегодня у меня есть сегодня 2 записи вчера 1 запись

Acutal Вопрос может кто-нибудь помочь мне extraced даты и времени, которое используется в запросе?

Я использую только один стол под названием: FilteredIncident Есть ли способ, чтобы преобразовать DateTime bb_casestartingtime к VARCHAR (так PHP может извлечь его), но до сих пор подсчитывают количество вхождений в день?

Если требуется какая-либо информация, пожалуйста, обращайтесь

Спасибо заранее!

(я переписал весь мой вопрос, потому что я написал первое сообщение в спешке)

ответ

0

Я решил проблему с работой arround, так как мне не нужно было видеть дни, когда есть 0 билетов, мне не нужно было создавать временную таблицу и делать левое соединение.

Решение, с которым я пришел, - использовать поля datetime (bb_casestartingtime) и использовать эти даты. Теперь название оси диаграммы соответствует строке диаграммы.

решение

Преобразовать переменную $, где поле даты и времени ставится на, к переменной даты и времени поля.

$rows[] = "['".$row[1]->format('D j-m')."',".$row[0]."],"; 
       ^   ^   ^
      The datetime row | The format | The amount of tickets 
0

Вы можете добиться того, что вы после этого, создав таблицу диапазон дат и в вы можете LEFT JOIN к нему, так что вы получите 0 для дней без билетов. Вы можете запустить этот код в изоляции, чтобы проверить, и это должно дать вам то, что вы можете адаптировать:

-- table for dummy data 
CREATE TABLE #FilteredIncident (bb_casestartingtime DATETIME) 

-- insert dummy data that has gaps and more than 7 days 
INSERT INTO #FilteredIncident 
     (bb_casestartingtime) 
VALUES ('20161110 12:00'), 
     ('20161110 11:00'), 
     ('20161109 10:00'), 
     ('20161108 13:00'), 
     ('20161107 09:00'), 
     ('20161104 07:00'), 
     ('20161104 05:00'), 
     ('20161104 16:00'), 
     ('20161103 18:00'), 
     ('20161103 19:00') 

-- create a date range table for last 7 days 
CREATE TABLE #DateRange (DateVal Date) 

-- insert last 7 days 
INSERT INTO #DateRange 
     (DateVal) 
VALUES (GETDATE()) 
     ,(DATEADD(D,-1,GETDATE())) 
     ,(DATEADD(D,-2,GETDATE()))  
     ,(DATEADD(D,-3,GETDATE()))  
     ,(DATEADD(D,-4,GETDATE()))  
     ,(DATEADD(D,-5,GETDATE()))  
     ,(DATEADD(D,-6,GETDATE()))  

-- SELECT * FROM #FilteredIncident -- uncomment to see data 
-- SELECT * FROM #DateRange  -- uncomment to see date range data 

SELECT COUNT(fi.bb_casestartingtime) TotalRows, dr.DateVal 
FROM #DateRange dr 
LEFT JOIN #FilteredIncident fi ON dr.DateVal = cast(fi.bb_casestartingtime AS DATE) 
GROUP BY dr.DateVal 
ORDER BY dr.DateVal 

DROP TABLE #FilteredIncident 
DROP TABLE #DateRange  

производит:

TotalRows DateVal 
3   2016-11-04 
0   2016-11-05 
0   2016-11-06 
1   2016-11-07 
1   2016-11-08 
1   2016-11-09 
2   2016-11-10 

Примечание: Я бы рекомендовал перенести этот SQL-код в хранимую процедуру, в отличие от построения строки для выполнения, как вы делаете.

+1

Спасибо, первое, что я попробую завтра, я больше не работаю прямо сейчас, но спасибо за ваш ответ.Я дам вам знать, если это сработает. – Stage

Смежные вопросы