2016-05-16 55 views
1

只是试图清理其他人在postgres中完成的某些功能。PSQL函数帮助 - 日期格式问题

有人会知道以下几点吗?这是工作,但日期格式改变时,它开始进入'1999-09-07 16:30:00.000'

我不知道以前的格式是什么。

select 
case 
    when dbDate = '' then null 
    when dbDate != '^\d.*' then dbDate::timestamp 
    else '1900-01-01'::date + dbDate::int 
end as dbDate 

每当我调用该函数的日期这让我

invalid input syntax for integer: "1999-09-07 16:30:00.000"

+2

你为什么铸造'dbDate'为整数? –

+1

我没有写代码,所以我不确定。应该是dbDate :: timestamp? – emraldinho

回答

2

这个漂亮的功能正在采取多种类型的输入日期和规范他们。

我认为,预计中的一种:

  • 空白,它让我们为null
  • 日期格式以“MMM”的日期,其不会通过(即东西“^ \ d *”。不带数字),它会转换为日期开始
  • 一些

的原因,日期正在铸成的INT是因为失败的前两个测试的PE后rson写这是期待INT。他们希望像Excel一样将整数加到Time的开始处(即1900-01-01)。

1999-09-07 16:30:00.000未能通过第二次测试,即使它可以作为时间进行施法。

这会传递给else,它无法将其转换为INT,并引发错误。

在这种情况下,您需要更改第二次测试。使它能够允许你进入的日期时间,但会拒绝应该添加到1900-01-01的数字。

如果你不认为你将不得不在未来应加1900-01-01号码,然后就摆脱了第三次试验,并使用

select 
case 
    when dbDate = '' then null 
    else dbDate::timestamp 
end as dbDate 
+1

将取代命令是: 替换dateconverter选择案例时,dbDate =''然后为空其他dbDate :: timestamp结束为dbDate – emraldinho

+0

老实说,我认为这取决于以前的格式是什么,以及您通常在dbdate上获得什么样的数据领域。运行一个查询来提取所有唯一的dbdate并将其签出。如果在添加旧日期格式时看到大量有意义的整数,则可能需要对该功能进行一些更改以允许此数据。如果他们都是日期时间或zls你可以使用上述。 – EoinS

+0

此解决方案适合您吗?如果您选择INT而不是日期并获得一些奇怪的日期时间,我们可以采用一种方式来接受传入的INT并将其更改为函数最初的日期。 – EoinS