Вам не нужно применять дневное условие, так как ваше изображение не меняет базис в день. Это меняется во времени. Таким образом, вы можете использовать что-то вроде ниже:
$h = date('H'); // it will return hour in 24 format.
if ($h >= 4 && $h < 12) $img = 'img/s1.jpg'; //if it's between 4am and 12pm show day strength 1 image
else if ( ($h >= 12 && $h <= 23) || ($h >= 1 && $h <= 2) ) $img = 'img/c1.jpg'; //it's between 12pm and 2am show evening condition 1 image
else if ($h >= 2 && $h < 4) $img = 'img/rest.jpg'; //if it's between 2am and 4am show rest image
Вы можете вносить изменения в свои арифметические операторы в соответствии с вашими требованиями. И если ваше изображение меняется в зависимости от дня, вы можете просто добавить дату в переменную вашего изображения, как показано ниже:
$h = date('H'); // it will return hour in 24 format.
$d = date('d');
if ($h >= 4 && $h < 12) $img = 'img/s'.$d.'.jpg';
else if ( ($h >= 12 && $h <= 23) || ($h >= 1 && $h <= 2) ) $img = 'img/c'.$d.'.jpg';
else if ($h >= 2 && $h < 4) $img = 'img/rest.jpg';
Надеюсь, это поможет вам.
Помните, что NULL отличается от 0. Таким образом, два фрагмента кода в вопросе могут возвращать разные результаты для одного и того же ввода.
Например, если BeginningQuantity имеет значение NULL, первое выражение оценивается как NULL:
CASE WHEN (NULL + ?)=0 THEN 0 ELSE ?/(NULL + ?) END
Теперь (NULL +?) Равно NULL, а NULL = 0 - false, поэтому предложение ELSE оценивается, давая? / (NULL +?), Что приводит к NULL. Однако второе выражение выглядит следующим образом:
ISNULL((?)/NULLIF(NULL + ?,0),0)
Здесь NULL +? становится NULL, и поскольку NULL не равно 0, NULLIF возвращает первое выражение, которое является NULL. Внешний ISNULL улавливает это и возвращает 0.
Итак, примите решение: защищаетесь ли вы от деления на ноль или деления на NULL? ; -)
На мой взгляд, использование Isnull / Nullif быстрее, чем использование Case When. Я предпочитаю isnull / nullif.
Я думаю, что в вашем примере производительность незначительна. Но в других случаях, в зависимости от сложности вашего делителя, ответ будет «зависит от обстоятельств».
Вот интересный блог по теме:
Для удобства чтения мне нравится Case / When.
] Я бы использовал ISNULL, но попытался бы отформатировать его так, чтобы он лучше отображал смысл:
SELECT
x.zzz
,x.yyyy
,ISNULL(
EndingQuantity / NULLIF(BeginningQuantity+BAdjustedQuantity,0)
,0)
,x.aaa
FROM xxxx...
CASE WHEN (coalesce(BeginningQuantity,0) + coalesce(BAdjustedQuantity,0))=0 THEN 0 ELSE coalesce(EndingQuantity,0)/(coalesce(BeginningQuantity,0) + coalesce(BAdjustedQuantity,0)) END
ваш лучший вариант imho
Извините, вот еще один упрощенный sql-запрос.
SELECT
(ISNULL([k1],0) + ISNULL([k2],0)) /
CASE WHEN (
(
CASE WHEN [k1] IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN [k2] IS NOT NULL THEN 1 ELSE 0 END
) > 0 )
THEN
(
CASE WHEN [k1] IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN [k2] IS NOT NULL THEN 1 ELSE 0 END
)
ELSE 1 END
FROM dbo.[Table]