Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在postgreSQL中使用从日期算起的月日,将所有员工的经验增加1_Sql_Postgresql_Date - Fatal编程技术网

在postgreSQL中使用从日期算起的月日,将所有员工的经验增加1

在postgreSQL中使用从日期算起的月日,将所有员工的经验增加1,sql,postgresql,date,Sql,Postgresql,Date,我们拥有所有员工的DOJ(加入日期),我们需要将所有员工的经验增加到“1”。我们必须考虑“SysDead”和“SysDe+7天(星期)”< /强>作为条件。 如果有人在那一周跌倒,他的经验应该增加,而只考虑“月和日”,忽略从日期算起的年份 假设:- date=20-08-2015,我们必须从忽略年份的所有日期中选择20-08(dd-mm)到26-08(dd-mm)的所有记录 预期结果可能是一个有经验的虚拟列 提前谢谢 select workername, workerobj

我们拥有所有员工的DOJ(加入日期),我们需要将所有员工的经验增加到“1”。我们必须考虑<强>“SysDead”和“SysDe+7天(星期)”< /强>作为条件。 如果有人在那一周跌倒,他的经验应该增加,而只考虑“月和日”,忽略从日期算起的年份

假设:-
date=20-08-2015
,我们必须从忽略年份的所有日期中选择20-08(dd-mm)到26-08(dd-mm)的所有记录

预期结果可能是一个有经验的虚拟列

提前谢谢

select 
    workername, 
    workerobj, 
    DATE_PART('year', current_date) - DATE_PART('year', workerobj) + 1 experience
from emp_tbl
where 
to_date(to_char(workerobj, 'DD-MM'), 'DD-MM') 
between 
to_date(to_char(current_date, 'DD-MM'), 'DD-MM') and
to_date(to_char(current_date + 7, 'DD-MM'), 'DD-MM')
to_char(DOJ,'DD-MM')
将从
DOJ


to_date(to_char(DOJ,'DD-MM'),'DD-MM')
将通过添加
0001
作为年份来创建一个日期。(实际年份将被忽略)

好的,这是一个真正的野兽,所以首先是肉,然后是牙签:

WITH chk AS (
  SELECT to_timestamp('12-28', 'MM-DD') AS dt
), doj_doy AS (
  SELECT workername, workerdoj, extract('doy' from workerdoj) AS doy
  FROM my_table
), date_tails AS (
  -- Get the MM/DD in year 0
  SELECT workername, workerdoj,
         (workerdoj - extract('year' from workerdoj) * interval '1 year') AS date0
  FROM doj_doy
  UNION
  -- Add DOJ early in the year (year +1)
  SELECT workername, workerdoj,
         (workerdoj - (extract('year' from workerdoj) - 1) * interval '1 year') AS date0
  FROM doj_doy
  WHERE doy < 8
)
SELECT workername, workerdoj
FROM date_tails, chk
WHERE date0 BETWEEN dt AND dt + interval '6 days';
这就给我们留下了0年的
时间戳
值。该结果在1月的第一周对那些司法部进行了
UNION
ed,当时
doy<8
,其中
doy
已在
DOJ\u-doy
CTE中计算。这样可以确保在进行圣诞后搜索时包含1月初的美国司法部


在第一个CTE中,您必须指定要搜索的年份日期,然后您就可以开始了。如果您想通过
current_date
或其他
timestamp
值来执行此操作,那么您也应该将其转换为0年日期。

您可以添加一些示例数据(包括不应该更新的行)以及基于该示例数据的预期结果吗。@a_horse_没有名称,我已经更新了问题。谢谢:)我们需要在一个虚拟列的Select语句中获取它,我已经更新了问题,请检查它。我很感谢你的努力,兄弟:)这张桌子有没有列
经验
。?在sysdate和dojNo之间,我们必须使用一个使用SELECT语句的伪列。它正在计算所有不在20-08(dd-mm)到26-08(dd-mm)
到字符(当前日期+7,'dd-mm')之间的记录将给出<代码> 06-08/COD> >如果代码> CurrnalDeals是代码> 30-07XXXX谢谢帕特里克的努力,但是我们也要考虑闰年。
(workerdoj - extract('year' from workerdoj) * interval '1 year') AS date0