0

最終的に、2 つの日付 (ContractDate と CloseDate) の間の日数の差を取得しようとしています。それらの日付はすでにMySQL DBに0000-00-00の形式で保存されていますが、式に正しく挿入することはできません. これと他のいくつかの項目に対して次のクエリを使用しています。

$q_groups = mysql_query("SELECT CONCAT(contacts.last_name, ', ', contacts.first_name) as Name,
                        loans.subject_property as SubjectProperty, loans.fKeyUserLoanOfficer,
                        loan_types.name as LoanType, loans.closed_on as CloseDate, loans.contract_date as ContractDate, loans.amount as Amount, loan_status_types.name as LoanStatus,
                        loans._id, loans.fKeyReferral
                        FROM `loans`
                        LEFT JOIN `loan_status_types` ON (loans.fKeyLoanDetail = loan_status_types._id)
                        LEFT JOIN `loan_status` ON (loan_status._id = loan_status_types.fKeyType)
                        LEFT JOIN `loan_types` ON (loans.fKeyLoanType = loan_types._id)
                        LEFT JOIN `contacts` ON (contacts._id = loans.fKeyContact)
                        WHERE loans.fKeyGroup = '{$gid}' AND loan_status.name LIKE '%Closed%'
                        ORDER BY loans.closed_on DESC")
                        or die(ErrorLog::handle(mysql_error()));

私がやりたいことは、上記のクエリからの 2 つの日付 (ContractDate と CloseDate) に、以下の日付 (赤) を入力させることです。

$start = strtotime("2012-08-16");
$end = strtotime("2012-06-28");
$dayz = ($start - $end) / (60 * 60 * 24);

DB を表示すると、「closed_on」フィールドの日付は 2012-08-16 で、「contract_date」フィールドを表示すると、日付は 2012-06-28 です...しかし、この情報を取得できませんエラーやデータがまったく表示されずに正しく挿入されました。

** 私が問題を抱えているのは...静的な日付をフィールド データに置き換えるにはどうすればよいですか? **

ありがとう、エド

4

4 に答える 4

1
SELECT
TO_DAYS(closed_on) - TO_DAYS(contract_date) AS `dayz`

既存のクエリに追加:

$q_groups = mysql_query("SELECT CONCAT(contacts.last_name, ', ', contacts.first_name) as Name,
                        loans.subject_property as SubjectProperty, loans.fKeyUserLoanOfficer,
                        loan_types.name as LoanType, loans.closed_on as CloseDate, loans.contract_date as ContractDate, loans.amount as Amount, loan_status_types.name as LoanStatus,
                        loans._id, loans.fKeyReferral,
                        TO_DAYS(loans.closed_on) - TO_DAYS(loans.contract_date) AS `dayz`
                        FROM `loans`
                        LEFT JOIN `loan_status_types` ON (loans.fKeyLoanDetail = loan_status_types._id)
                        LEFT JOIN `loan_status` ON (loan_status._id = loan_status_types.fKeyType)
                        LEFT JOIN `loan_types` ON (loans.fKeyLoanType = loan_types._id)
                        LEFT JOIN `contacts` ON (contacts._id = loans.fKeyContact)
                        WHERE loans.fKeyGroup = '{$gid}' AND loan_status.name LIKE '%Closed%'
                        ORDER BY loans.closed_on DESC")
                        or die(ErrorLog::handle(mysql_error()));

タイムスタンプを1日の秒数で割るだけでは、DSTの境界などを越えて正しく機能しないため、正確性という追加の利点があります。

于 2012-08-17T00:30:57.527 に答える
0

PHP に行き詰まっている場合は、DateTimeオブジェクトを使用できます。

  $datetime1 = new DateTime('2009-10-11');  
  $datetime2 = new DateTime('2009-10-13');
  $interval = $datetime1->diff($datetime2);
  echo $interval->format('%R%a days');

DateTime::diff()マニュアル。

于 2012-08-17T00:03:16.213 に答える
0

MySQL にデータ操作を任せることをお勧めします。ネイティブの日付/時刻データ型だけでなく、PHP よりもはるかに優れた機能を備えています。明確な言語で時間と日付を加算および減算でき、Unix タイムスタンプとの間のラウンドトリップの問題はありません。

そして、Unix タイムスタンプでそれをしたくありません! これは、日付操作の精度が高すぎるためです。秒対日です。これは、間違ったソリューションであるという良い兆候です。また、タイムゾーンや夏時間への移行なども許可されていないため、自分で処理しようとすると、長い滑りやすい坂道の始まりになります. 適切な日付処理関数を使用する方がはるか優れています。なぜなら、それらはすでに広範囲にデバッグされ、Just Work になっているからです。

新しい PHP DateTimeライブラリを使用することもできますが、日付が MySQL から取得され、MySQL に戻る場合は、MySQL を使用してください。それはより少ない変換です。

于 2012-08-16T23:50:06.713 に答える
0

データベースに既にデータがある場合は、 staticsan が指摘したように高速であるため、それを使用することをお勧めします。

例は次のようになりますが、以下の静的な日付をテーブルのフィールド データに置き換えることになります。

SELECT DATEDIFF('2010-10-08 18:23:13', '2010-09-21 21:40:36') AS days;
于 2012-08-17T00:10:20.000 に答える