在PostgreSQL中是否有一个函数需要年、月和日来创建日期?

vaj7vani  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(4)|浏览(126)

在文档中,我只能找到一种从字符串创建日期的方法,例如DATE '2000-01-02'。这完全令人困惑和烦恼。我想要的是一个接受三个参数的函数,所以我可以使用make_date(2000, 1, 2),使用整数而不是字符串,并返回一个日期(而不是字符串)。PostgreSQL有这样的内置函数吗?
我问这个问题的原因是因为我不喜欢用字符串来描述非字符串的东西,日期不是字符串,它们是日期。
我使用的客户端库是HDBC-PostgreSQL for Haskell,我使用的是PostgreSQL 9.2.2。

x7yiwoj4

x7yiwoj41#

在PostgreSQL 9.4及更高版本中,实际上有一个make_date(year int, month int, day int)函数可以创建日期。
https://www.postgresql.org/docs/current/functions-datetime.html

ttp71kqs

ttp71kqs2#

需要在SQL中常规地这样做通常意味着你的数据模型有问题,你在数据库中存储的日期被分割成字段,而不是真正的日期或时间戳字段,或者你有严重的转义和SQL注入问题。
以下任何一种方法都可以解决您当前的问题:

CREATE OR REPLACE FUNCTION make_date(year integer, month integer, day integer) AS $$
SELECT year * INTERVAL '1' YEAR + month * INTERVAL '1' MONTH + day * INTERVAL '1' DAY;
$$ LANGUAGE sql STRICT IMMUTABLE;

字符串

CREATE OR REPLACE FUNCTION make_date(year integer, month integer, day integer) AS $$
SELECT format('%s-%s-%s', year, month, day)::date;
$$ LANGUAGE sql STRICT IMMUTABLE;


但请继续读下去
你问这个问题的事实让我认为你可能试图在你的应用程序中像这样构建SQL:

$sql = "SELECT date'" + year + '-' + month + '-' + day + "';";


这通常是 * 危险的 * 和 * 错误的 *(虽然如果yearmonthday是整数数据类型,可能不会直接不安全)。如果这是你正在做的事情,你应该使用 * 参数化查询 * 来避免SQL injection,并保存你自己在转义和文字格式方面的大量麻烦。请参阅http://bobby-tables.com/
下面是如何在psycopg 2中使用Python中的参数化语句查询日期(因为您没有指定语言或工具):

import datetime
import psycopg2
conn = psycopg2.connect('')
curs = conn.cursor()
curs.execute('SELECT %s;', ( datetime.date(2000,10,05), ))
print repr(curs.fetchall());


这将打印:

[(datetime.date(2000, 10, 5),)]


也就是一个数组,里面有一个Python日期。你可以看到它在数据库中来回运行,你永远不必担心PostgreSQL的日期格式或表示,因为当你使用参数化语句时,psycopg 2和PostgreSQL会为你解决这个问题。参见this earlier related answer

bqujaahr

bqujaahr3#

另一个值得尝试的是to_date()函数。它类似于上面提到的绑定,并且不需要创建用户定义的函数。
http://www.postgresql.org/docs/current/static/functions-formatting.html
我以这种形式使用它:

to_Date(month::varchar ||' '|| year::varchar, 'mm YYYY')

字符串

envsm3lx

envsm3lx4#

可以使用date(concat())

select date(concat(2000::varchar, '-01-01'))

字符串

相关问题