MySQL和PostgreSQL通用的MONTH()和YEAR()函数的任何替代函数

MySQL和PostgreSQL通用的MONTH()和YEAR()函数的任何替代函数,mysql,sql,database,postgresql,Mysql,Sql,Database,Postgresql,编写可以在MySQL和PostgreSQL中运行的查询(sql文件),到目前为止,除了以下内容外,一切正常: SELECT MONTH(Date), YEAR(Date) FROM Ticket; 用于从Ticket表中的Date列(是的,这是真的,我无法更改此列的名称)中提取月号(9,10,11…)和年(2011,2012…)。它在MySQL中工作正常,但当我在PostgreSQL中运行查询时,它会为MONTH()和YEAR()提供以下错误消息 在研究了一点之后,我找到了一些其他的函数,这些

编写可以在MySQL和PostgreSQL中运行的查询(sql文件),到目前为止,除了以下内容外,一切正常:

SELECT MONTH(Date), YEAR(Date) FROM Ticket;
用于从Ticket表中的Date列(是的,这是真的,我无法更改此列的名称)中提取月号(9,10,11…)和年(2011,2012…)。它在MySQL中工作正常,但当我在PostgreSQL中运行查询时,它会为MONTH()和YEAR()提供以下错误消息


在研究了一点之后,我找到了一些其他的函数,这些函数可以在Postgres中完成这项工作,但是我担心这些函数在MySQL中可能不起作用。强烈期待任何可能的解决方案。

如果您在字段前面使用别名,而使用EXTRACT,则相同的查询将适用于PostgreSQL和MySQL:

SELECT EXTRACT(MONTH FROM t.Date) AS MonthOfDate, 
       EXTRACT(YEAR FROM t.Date) AS YearOfDate
FROM Ticket t;


因为您愿意接受任何可能的解决方案,我有两个想法

只要您需要编写简单的sql语句,我就建议您使用一个预先填充了日期的表以及列中相应的属性

有时我用这样的桌子:

ID   THE_DATE    THE_MONTH_OF_DATE   THE_YEAR_OF_DATE   ...
-----------------------------------------------------------
1    01/01/2014  1                   2014
2    01/02/2014  1                   2014
3    01/03/2014  1                   2014
4    01/04/2014  1                   2014
5    02/01/2014  2                   2014
6    03/01/2014  3                   2014
n    xx/xx/xxxx  x                   xxxx
此表预先填充了应用程序所需的日期,可以轻松地与所有日期关联,然后提供所需的列


更好的解决方案是使用数据库抽象层/对象关系映射器,根据基础数据库,将查询转换为正确的数据库方言,例如Hibernate(Java)。

这两个数据库的某些函数有所不同,您可以看到

mysql-选择工作日('2016-06-24')

博士后-选择摘录(道琼斯指数从“2016-06-20”起:日期)


或者,您可以访问

@Hardy查看更多参考资料,请注意,日期是我的表票证中的一列……我认为这个答案可能对您的需求很有用:OP没有提到应用层(也许它甚至没有提到这一点)。另外,使用单独的日期部分存储的解决方案将需要额外的努力来维护数据完整性(如
更新
触发器)。您是对的。OP提到必须在不同数据库上运行的查询,我假设该需求背后有一个应用程序(这是我的背景)。我不明白您的第二点:预填充表中的数据完整性问题出现在哪里?这不是问题。这是一件应该提到的事情,因为如果数据是可变的,那么完整性将在没有额外检查的情况下失败(因此触发器是一个选项,但这又是跨DBMS的问题)嗯,我没有意识到MySQL支持SQL标准
EXTRACT(…)
。我不是真的使用MySQL,但很高兴知道。看到前面评论中的
SQL标准,我想知道MS-SQL。。。。MS-SQL仍然不支持它(请参阅:)
ID   THE_DATE    THE_MONTH_OF_DATE   THE_YEAR_OF_DATE   ...
-----------------------------------------------------------
1    01/01/2014  1                   2014
2    01/02/2014  1                   2014
3    01/03/2014  1                   2014
4    01/04/2014  1                   2014
5    02/01/2014  2                   2014
6    03/01/2014  3                   2014
n    xx/xx/xxxx  x                   xxxx