Как ограничить тип события одним днем - PullRequest
0 голосов
/ 05 апреля 2011

У меня такой запрос, как ... он не работает, но я получаю синтаксическую ошибку в бите WHERE NOT EXISTS. Однако я не уверен, что это сработало бы так, как я бы этого хотел. В любом случае, я хочу сделать так, чтобы в любой день мог быть только один «В», и это будет первый случай… но я не уверен, сработал ли приведенный ниже код, что все равно будет «B» до самого конца.

UPDATE FoodIntake
 SET MealTypeCode = CASE

WHEN substr(DateTime, -8)
 BETWEEN (SELECT BreakfastStart FROM Patient WHERE PatientId = :PatientId)
 AND (SELECT LunchStart FROM Patient WHERE PatientId = :PatientId)
 AND CarbAmount >= 25
 AND MealTypeCode IS NULL
 WHERE NOT EXISTS (
    SELECT * FROM FoodIntake as Old 
    WHERE MealTypeCode = 'B' 
    AND substr(Old.DateTime, 10) = substr(FoodIntake.DateTime, 10)
)
 THEN 'B'
END

Другой вариант, к которому я не уверен, как подходить, это пометить все, что применимо как B, затем выполнить второй запрос, чтобы найти любое время, когда есть 2 B, в один день и переименовать второй как что-то еще. .

У меня есть запрос, который я пытался для этого, но я знаю, что у него есть некоторые серьезные проблемы ... есть некоторые синтаксические ошибки, которые я не могу полностью понять, но я думаю, что, по крайней мере, они получают то, что я хочу сделать.

UPDATE FoodIntake
 SET MealTypeCode = 'U'
WHERE MealTypeCode = 'B'
AND count(SELECT 1 FROM FoodIntake as Old WHERE MealTypeCode ='B' AND substr(Old.DateTime, 10) = substr(FoodIntake.DateTime, 10) ) > 1
AND FoodIntake.DateTime > (SELECT DateTime FROM FoodIntake as Old WHERE MealTypeCode ='B' AND substr(Old.DateTime, 10) = substr(FoodIntake.DateTime, 10) ORDER By DateTime ASC LIMIT = count-1)

1 Ответ

0 голосов
/ 05 апреля 2011

Я думаю, вам лучше использовать для этого оператор IF ... ELSE, который, хотя, возможно, будет более подробным, будет более явно указывать на логику, происходящую здесь.

IF (SELECT COUNT(1) FROM FoodIntake 
    WHERE (date('now') BETWEEN date('now','start of day') 
    AND date('now','start of day','+1 day') )
    AND MealTypeCode = 'B') > 0

 -- Make update based on 'B' code already taken

ELSE

 -- Make update based on 'B' code not yet taken

Я не парень SQLite,но я хорошо разбираюсь с MySQL и T-SQL, поэтому, если функции даты неточны, я ссылался на эту статью: http://www.sqlite.org/cvstrac/wiki?p=DateAndTimeFunctions

...