Переменные разрешены во время компиляции, времени выполнения методов. ARef имеет тип A, поэтому aRef.Intvalue является временем компиляции, равным 1.
СЛУЧАЙ является, по моему скромному мнению, Вашим наилучшим вариантом:
SELECT ID,
CASE WHEN Date1 > Date2 THEN Date1
ELSE Date2
END AS MostRecentDate
FROM Table
<час> , Если один из столбцов nullable просто, должен включить в COALESCE
:
.. COALESCE(Date1, '1/1/1973') > COALESCE(Date2, '1/1/1973')
select ID,
case
when Date1 > Date2 then Date1
else Date2
end as MostRecentDate
from MyTable
Можно бросить это в скалярную функцию, которая делает обработку, аннулирует немного легче. Очевидно, это не будет немного быстрее, чем встроенный оператор выбора.
ALTER FUNCTION [fnGetMaxDateTime] (
@dtDate1 DATETIME,
@dtDate2 DATETIME
) RETURNS DATETIME AS
BEGIN
DECLARE @dtReturn DATETIME;
-- If either are NULL, then return NULL as cannot be determined.
IF (@dtDate1 IS NULL) OR (@dtDate2 IS NULL)
SET @dtReturn = NULL;
IF (@dtDate1 > @dtDate2)
SET @dtReturn = @dtDate1;
ELSE
SET @dtReturn = @dtDate2;
RETURN @dtReturn;
END
В SQL Server 2012 можно использовать сокращенное выражение IIF
- CASE
, хотя последнее является стандартом SQL:
SELECT ID,
IIF(DateColA > DateColB, DateColA, DateColB) AS MostRecentDate
FROM theTable
Каждый раз, когда возможно, используйте Подставляемые функции, как они переносят, ни одна из производительности обычно не выходит связываемый с UDFs...
Create FUNCTION MaximumDate
(
@DateTime1 DateTime,
@DateTime2 DateTime
)
RETURNS TABLE
AS
RETURN
(
Select Case When @DateTime1 > @DateTime2 Then @DateTime1
Else @DateTime2 End MaxDate
)
GO
Для инструкций по использованию, см. Здесь
Кроме оператора выбора, я не верю так...
Select Case When DateColA > DateColB Then DateColA
Else DateColB End MostRecent
From Table ...
AFAIK, нет встроенной функции для получения максимум двух значений, но вы можете легко написать свое собственное как:
CREATE FUNCTION dbo.GetMaximumDate(@date1 DATETIME, @date2 DATETIME)
RETURNS DATETIME
AS
BEGIN
IF (@date1 > @date2)
RETURN @date1
RETURN @date2
END
и назвать его как
SELECT Id, dbo.GetMaximumDate(Date1, Date2)
FROM tableName