根据其他列 PSQL 的值在 SELECT 语句中添加其他列
Add additional column in a SELECT statement based on values of other columns PSQL
我每个人有 table 个驾驶执照,并且知道某人何时获得了驾驶执照。驾照的有效期可以是从您获得驾照之日起的 X 天,也可以是特定日期。
acquired relative specific_date valid_type expiration_date
----------------------------------------------------------------------------------
2015-02-05 500 null days
2015-02-05 null 2016-03-05 date
2015-02-05 200 null days
2015-02-05 null 2016-02-22 date
我现在的查询是:
SELECT acquired,
relative_date,
specific_date,
valid_type
FROM person_drivers_license
WHERE (valid_type = 'days'
AND (EXTRACT(epoch
FROM acquired) - EXTRACT(epoch
FROM now()))/86400 + relative_date > 0)
OR (valid_type = 'DATE'
AND specific_date >= now()));
我正在尝试使用上面的 select 语句添加一个 expiration_date 列。如果是具体日期,直接取日期放入expiration_date,如果是相对日期,则根据获取的日期计算到期日期。这在 PSQL 中可行吗?
试试这个:
SELECT acquired,
relative_date,
specific_date,
valid_type
CASE valid_type
WHEN 'days' THEN acquired + relative_date
WHEN 'date' THEN specific_date
ELSE NULL
END AS expiration_date
FROM person_drivers_license;
首先 - 在 postgres 中有一种更简单的日期数学计算方法。您可以使用类似的东西:
acquired + relative_date * interval '1 day' >= current_date
或
acquired + relative_date >= current_date
-- any integer can be treated as interval in days for date mathematics is SQL
对于这个问题 - 尝试其中一个:
CASE WHEN valid_type = 'days'
THEN acquired + relative_date * interval '1 day'
WHEN valid_type = 'date'
THEN specific_date
--ELSE ??? you may specify something here
END
或
COALESCE(specific_date, acquired + relative_date * interval '1 day')
查询可能如下所示:
SELECT acquired,
relative_date,
specific_date,
valid_type,
COALESCE(specific_date, acquired + relative_date * interval '1 day') as valid_date
FROM person_drivers_license
WHERE COALESCE(specific_date, acquired + relative_date * interval '1 day') >= current_date
你不需要pl/sql
SELECT acquired,
relative_date,
specific_date,
valid_type,
CASE WHEN specific date = "date" -- starts here
THEN specific date
ELSE acquired + cast('1 months' as interval)END
AS expiration_date -- end here
FROM person_drivers_license
WHERE (valid_type = 'days'
AND (EXTRACT(epoch
FROM acquired) - EXTRACT(epoch
FROM now()))/86400 + relative_date > 0)
OR (valid_type = 'DATE'
AND specific_date >= now()));
我每个人有 table 个驾驶执照,并且知道某人何时获得了驾驶执照。驾照的有效期可以是从您获得驾照之日起的 X 天,也可以是特定日期。
acquired relative specific_date valid_type expiration_date
----------------------------------------------------------------------------------
2015-02-05 500 null days
2015-02-05 null 2016-03-05 date
2015-02-05 200 null days
2015-02-05 null 2016-02-22 date
我现在的查询是:
SELECT acquired,
relative_date,
specific_date,
valid_type
FROM person_drivers_license
WHERE (valid_type = 'days'
AND (EXTRACT(epoch
FROM acquired) - EXTRACT(epoch
FROM now()))/86400 + relative_date > 0)
OR (valid_type = 'DATE'
AND specific_date >= now()));
我正在尝试使用上面的 select 语句添加一个 expiration_date 列。如果是具体日期,直接取日期放入expiration_date,如果是相对日期,则根据获取的日期计算到期日期。这在 PSQL 中可行吗?
试试这个:
SELECT acquired,
relative_date,
specific_date,
valid_type
CASE valid_type
WHEN 'days' THEN acquired + relative_date
WHEN 'date' THEN specific_date
ELSE NULL
END AS expiration_date
FROM person_drivers_license;
首先 - 在 postgres 中有一种更简单的日期数学计算方法。您可以使用类似的东西:
acquired + relative_date * interval '1 day' >= current_date
或
acquired + relative_date >= current_date
-- any integer can be treated as interval in days for date mathematics is SQL
对于这个问题 - 尝试其中一个:
CASE WHEN valid_type = 'days'
THEN acquired + relative_date * interval '1 day'
WHEN valid_type = 'date'
THEN specific_date
--ELSE ??? you may specify something here
END
或
COALESCE(specific_date, acquired + relative_date * interval '1 day')
查询可能如下所示:
SELECT acquired,
relative_date,
specific_date,
valid_type,
COALESCE(specific_date, acquired + relative_date * interval '1 day') as valid_date
FROM person_drivers_license
WHERE COALESCE(specific_date, acquired + relative_date * interval '1 day') >= current_date
你不需要pl/sql
SELECT acquired,
relative_date,
specific_date,
valid_type,
CASE WHEN specific date = "date" -- starts here
THEN specific date
ELSE acquired + cast('1 months' as interval)END
AS expiration_date -- end here
FROM person_drivers_license
WHERE (valid_type = 'days'
AND (EXTRACT(epoch
FROM acquired) - EXTRACT(epoch
FROM now()))/86400 + relative_date > 0)
OR (valid_type = 'DATE'
AND specific_date >= now()));