-2

datetime で日付を選択したいのですが、startDate の時間が endDate の時間よりも長い場合は、endDate に 1 日を追加します。これが私のコードですが、うまくいきません。ありがとう

SELECT Schedules.*
FROM 'schedules' AS Schedules 
WHERE Schedules.active=1
AND '2013-01-21' BETWEEN DATE(Schedules.startDate) AND 
(
IF TIME(Schedules.startDate)>TIME(Schedules.endDate) THEN 
SELECT (DATE(DATE_ADD(SELECT Schedules.endDate, INTERVAL 1 DAY)))
ELSE SELECT Schedules.endDate
)
4

2 に答える 2

1

mysql ステートメントのサンプルを作成しました。http://sqlfiddle.com/#!8/0752c/6 に従ってください

および必要に応じてコード:

CREATE TABLE `yourtable` (
  `Id` tinyint(4) NOT NULL,
  `Name` char(16) COLLATE utf8_bin DEFAULT NULL,
  `StartDate` DATETIME NOT NULL,
  `EndDate` DATETIME NOT NULL,
  PRIMARY KEY (`Id`)
);

INSERT INTO `yourtable`(`Id`,`Name`,`StartDate`,`EndDate`)
VALUES
(1, 'S1', '2013-01-03 11:23:59', '2013-01-04 13:26:12'),
(2, 'S2', '2013-01-04 00:00:00', '2013-01-04 23:59:59'),
(3, 'S3', '2013-01-12 23:59:59', '2013-01-12 22:20:25'),
(4, 'S4', '2013-01-15 18:15:15', '2013-01-17 13:20:20'),
(5, 'S5', '2013-01-20 21:23:59', '2013-01-22 19:26:12'),
(6, 'S6', '2013-01-04 11:23:59', '2013-01-20 19:26:12'),
(7, 'S7', '2013-01-04 11:23:59', '2013-01-20 08:26:12');


SELECT 
  Id, Name, StartDate, EndDate, 
  CASE WHEN TIME(StartDate) > TIME(EndDate) THEN 'true' ELSE 'false' END AS TF,
  CASE WHEN TIME(StartDate) > TIME(EndDate) THEN DATE(DATE_ADD(EndDate, INTERVAL 1 DAY)) ELSE DATE(EndDate) END AS EndDateUp
FROM yourtable 
WHERE 
DATE('2013-01-04') BETWEEN DATE(StartDate) AND 
  CASE WHEN TIME(StartDate) > TIME(EndDate) 
  THEN DATE(DATE_ADD(EndDate, INTERVAL 1 DAY)) 
  ELSE DATE(EndDate)  END
;
于 2013-01-23T08:25:07.060 に答える
0

MySQL にはIFステートメントがなく、IF関数だけがあります。それ以外の

IF TIME(Schedules.startDate)>TIME(Schedules.endDate) THEN 
SELECT (DATE(DATE_ADD(SELECT Schedules.endDate, INTERVAL 1 DAY)))
ELSE SELECT Schedules.endDate

IF括弧を付けて適切に書くこともできます:

IF(TIME(Schedules.startDate)>TIME(Schedules.endDate),
   DATE(DATE_ADD(Schedules.endDate, INTERVAL 1 DAY)),
   Schedules.endDate)

または、次のように記述できますCASE

CASE WHEN TIME(Schedules.startDate)>TIME(Schedules.endDate)
     THEN DATE(DATE_ADD(Schedules.endDate, INTERVAL 1 DAY))
     ELSE Schedules.endDate
END

SELECTどちらの場合も、式を評価するだけでサブクエリを実行していないため、これらの追加のキーワードはすべて省略してください。

于 2013-01-23T08:03:51.097 に答える