在文档中,我只能找到一种从字符串创建日期的方法,例如DATE '2000-01-02'
。这完全令人困惑和烦恼。我想要的是一个接受三个参数的函数,所以我可以使用make_date(2000, 1, 2)
,使用整数而不是字符串,并返回一个日期(而不是字符串)。PostgreSQL有这样的内置函数吗?
我问这个问题的原因是因为我不喜欢用字符串来描述非字符串的东西,日期不是字符串,它们是日期。
我使用的客户端库是HDBC-PostgreSQL for Haskell,我使用的是PostgreSQL 9.2.2。
4条答案
按热度按时间x7yiwoj41#
在PostgreSQL 9.4及更高版本中,实际上有一个
make_date(year int, month int, day int)
函数可以创建日期。https://www.postgresql.org/docs/current/functions-datetime.html
ttp71kqs2#
需要在SQL中常规地这样做通常意味着你的数据模型有问题,你在数据库中存储的日期被分割成字段,而不是真正的日期或时间戳字段,或者你有严重的转义和SQL注入问题。
以下任何一种方法都可以解决您当前的问题:
字符串
或
型
但请继续读下去
你问这个问题的事实让我认为你可能试图在你的应用程序中像这样构建SQL:
型
这通常是 * 危险的 * 和 * 错误的 *(虽然如果
year
,month
和day
是整数数据类型,可能不会直接不安全)。如果这是你正在做的事情,你应该使用 * 参数化查询 * 来避免SQL injection,并保存你自己在转义和文字格式方面的大量麻烦。请参阅http://bobby-tables.com/。下面是如何在psycopg 2中使用Python中的参数化语句查询日期(因为您没有指定语言或工具):
型
这将打印:
型
也就是一个数组,里面有一个Python日期。你可以看到它在数据库中来回运行,你永远不必担心PostgreSQL的日期格式或表示,因为当你使用参数化语句时,psycopg 2和PostgreSQL会为你解决这个问题。参见this earlier related answer。
bqujaahr3#
另一个值得尝试的是
to_date()
函数。它类似于上面提到的绑定,并且不需要创建用户定义的函数。http://www.postgresql.org/docs/current/static/functions-formatting.html
我以这种形式使用它:
字符串
envsm3lx4#
可以使用date(concat())
字符串