18 sql postgresql sql-date-functions
在文档中,我只能找到一种从字符串创建日期的方法,例如DATE '2000-01-02'.这完全令人困惑和恼人.我想要的是一个带三个参数的函数,所以我可以make_date(2000, 1, 2)使用整数而不是字符串,并返回一个日期(不是字符串).PostgreSQL有这样的内置函数吗?
我问这个的原因是因为我不喜欢将字符串用于不是字符串的东西.日期不是字符串; 他们是约会对象.
我使用的客户端库是Haskell的HDBC-PostgreSQL.我正在使用PostgreSQL 9.2.2.
Gre*_*ius 41
在PostgreSQL 9.4及更高版本中,实际上有一个make_date(year int, month int, day int)函数可以创建日期.
http://www.postgresql.org/docs/9.5/static/functions-datetime.html
通常需要在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 + "';";
这通常是危险和错误的(尽管可能没有直接与不安全如果year,month并且day是整数数据类型).您应该使用参数化查询,如果这是您正在做的以避免SQL注入并使用转义和文字格式保存自己很多麻烦.见http://bobby-tables.com/.
以下是使用psycopg2在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的日期格式或表示,因为当您使用参数化语句时,psycopg2和PostgreSQL会为您解决这个问题.请参阅此前相关的答案.
小智 5
其他值得尝试的是to_date()功能.它类似于上面提到的绑定,不需要创建用户定义的函数.
http://www.postgresql.org/docs/current/static/functions-formatting.html
我以这种形式使用它:
to_Date(month::varchar ||' '|| year::varchar, 'mm YYYY')