テーブルには、タイプSTOP
のSTART
とvarchar
の2つの列があります。
両方の列に違いが欲しいので、次を使用しています。
SELECT DATEDIFF(stop, start) AS difference from T1;
データ型が異なるため、null
が表示されます。
テストするために、私も試しました:
SELECT STR_TO_DATE('5/16/2011 20:14 PM', '%c %e %Y %H:%i:%s');
また、null
を与えています。
違いはどうすればいいですか?さまざまな形式のデータと時間がn
個あります。
start
とstop
の両方について、すべての日付とタイムスタンプを1つの形式に統合する必要があります。
例を挙げると、最初の行の時差を計算します。
これを計算するコードは次のとおりです。
SET @StartDT = 'Mon Jan 21, 21:07:47 IST 2013';
SET @StopDT = 'Tue Jan 22, 07:59:58';
SET @YYYY_Start = SUBSTR(@StartDT,-4);
SET @MMM_Start = RIGHT(LEFT(@StartDT,7),3);
SET @DD_Start = RIGHT(LEFT(@StartDT,10),2);
SET @HMS_Start = RIGHT(LEFT(@StartDT,20),8);
SET @YYYY_Stop = SUBSTR(@StartDT,-4);
SET @MMM_Stop = RIGHT(LEFT(@StopDT,7),3);
SET @DD_Stop = RIGHT(LEFT(@StopDT,10),2);
SET @HMS_Stop = RIGHT(LEFT(@StopDT,20),8);
SET @MM_Start = RIGHT(LEFT((LOCATE(@MMM_Start,'JanFebMarAprMayJunJulAugSepOctNovDev')+2)/3+100,3),2);
SET @MM_Stop = RIGHT(LEFT((LOCATE(@MMM_Stop,'JanFebMarAprMayJunJulAugSepOctNovDev')+2)/3+100,3),2);
SELECT @YYYY_Start,@YYYY_Stop,@MM_Start,@MM_Stop,@DD_Start,@DD_Stop,@HMS_Start,@HMS_Stop,@MM_Start,@MM_Stop;
SET @YYYMMDD_Start = CONCAT(@YYYY_Start,'-',@MM_Start,'-',@DD_Start);
SET @YYYMMDD_Stop = CONCAT(@YYYY_Stop,'-',@MM_Stop,'-',@DD_Stop);
SET @TS_Start = CONCAT(@YYYMMDD_Start,' ',@HMS_Start);
SET @TS_Stop = CONCAT(@YYYMMDD_Stop,' ',@HMS_Stop);
SET @TimeDiffSec = UNIX_TIMESTAMP(@TS_Stop) - UNIX_TIMESTAMP(@TS_Start);
SET @TimeDiff = SEC_TO_TIME(@TimeDiffSec);
SELECT @TS_Start,@TS_Stop,@TimeDiffSec,@TimeDiff;
違いを確認する準備はできましたか?ここにあります:
mysql> SET @StartDT = 'Mon Jan 21, 21:07:47 IST 2013';
Query OK, 0 rows affected (0.00 sec)
mysql> SET @StopDT = 'Tue Jan 22, 07:59:58';
Query OK, 0 rows affected (0.00 sec)
mysql> SET @YYYY_Start = SUBSTR(@StartDT,-4);
Query OK, 0 rows affected (0.00 sec)
mysql> SET @MMM_Start = RIGHT(LEFT(@StartDT,7),3);
Query OK, 0 rows affected (0.00 sec)
mysql> SET @DD_Start = RIGHT(LEFT(@StartDT,10),2);
Query OK, 0 rows affected (0.00 sec)
mysql> SET @HMS_Start = RIGHT(LEFT(@StartDT,20),8);
Query OK, 0 rows affected (0.00 sec)
mysql> SET @YYYY_Stop = SUBSTR(@StartDT,-4);
Query OK, 0 rows affected (0.00 sec)
mysql> SET @MMM_Stop = RIGHT(LEFT(@StopDT,7),3);
Query OK, 0 rows affected (0.00 sec)
mysql> SET @DD_Stop = RIGHT(LEFT(@StopDT,10),2);
Query OK, 0 rows affected (0.00 sec)
mysql> SET @HMS_Stop = RIGHT(LEFT(@StopDT,20),8);
Query OK, 0 rows affected (0.00 sec)
mysql> SET @MM_Start = RIGHT(LEFT((LOCATE(@MMM_Start,'JanFebMarAprMayJunJulAugSepOctNovDev')+2)/3+100,3),2);
Query OK, 0 rows affected (0.00 sec)
mysql> SET @MM_Stop = RIGHT(LEFT((LOCATE(@MMM_Stop,'JanFebMarAprMayJunJulAugSepOctNovDev')+2)/3+100,3),2);
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @YYYY_Start,@YYYY_Stop,@MM_Start,@MM_Stop,@DD_Start,@DD_Stop,@HMS_Start,@HMS_Stop,@MM_Start,@MM_Stop;
+-------------+------------+-----------+----------+-----------+----------+------------+-----------+-----------+----------+
| @YYYY_Start | @YYYY_Stop | @MM_Start | @MM_Stop | @DD_Start | @DD_Stop | @HMS_Start | @HMS_Stop | @MM_Start | @MM_Stop |
+-------------+------------+-----------+----------+-----------+----------+------------+-----------+-----------+----------+
| 2013 | 2013 | 01 | 01 | 21 | 22 | 21:07:47 | 07:59:58 | 01 | 01 |
+-------------+------------+-----------+----------+-----------+----------+------------+-----------+-----------+----------+
1 row in set (0.00 sec)
mysql> SET @YYYMMDD_Start = CONCAT(@YYYY_Start,'-',@MM_Start,'-',@DD_Start);
Query OK, 0 rows affected (0.00 sec)
mysql> SET @YYYMMDD_Stop = CONCAT(@YYYY_Stop,'-',@MM_Stop,'-',@DD_Stop);
Query OK, 0 rows affected (0.00 sec)
mysql> SET @TS_Start = CONCAT(@YYYMMDD_Start,' ',@HMS_Start);
Query OK, 0 rows affected (0.00 sec)
mysql> SET @TS_Stop = CONCAT(@YYYMMDD_Stop,' ',@HMS_Stop);
Query OK, 0 rows affected (0.00 sec)
mysql> SET @TimeDiffSec = UNIX_TIMESTAMP(@TS_Stop) - UNIX_TIMESTAMP(@TS_Start);
Query OK, 0 rows affected (0.00 sec)
mysql> SET @TimeDiff = SEC_TO_TIME(@TimeDiffSec);
Query OK, 0 rows affected (0.00 sec)
最終回答
mysql> SELECT @TS_Start,@TS_Stop,@TimeDiffSec,@TimeDiff;
+---------------------+---------------------+--------------+-----------+
| @TS_Start | @TS_Stop | @TimeDiffSec | @TimeDiff |
+---------------------+---------------------+--------------+-----------+
| 2013-01-21 21:07:47 | 2013-01-22 07:59:58 | 39131 | 10:52:11 |
+---------------------+---------------------+--------------+-----------+
1 row in set (0.00 sec)
これは正しいですが、特に一部の行の形式が異なるため、すべての行に対してこの複雑なメソッドをスクリプト化するのは非論理的です。
したがって、start
列とstop
列をDATETIME
またはTIMESTAMP
に変換することをお勧めします。