【问题标题】:SQL: to_char alternative for Oracle AND SQL-ServerSQL:Oracle AND SQL-Server 的 to_char 替代方案
【发布时间】:2015-11-10 12:37:05
【问题描述】:

我有一些用于 Oracle 的 sql 语句。我的一个程序使用了这个 sql 语句。 我想在我的程序中支持 Oracle 和 SQL-Server,而不需要针对 Oracle 和 SQL-Server 使用不同的 sql 语句。

对于特定的 Oracle SQL 语句,我可以使用哪种替代方法:

  • to_char(FIELDNAME, 'YYYY')
  • to_char(FIELDNAME, 'YYYYMMDD')
  • to_char(FIELDNAME, 'DD.MM.YYYY')

sql 语句必须适用于 Oracle SQL-Server。

【问题讨论】:

  • 从您的数据库中选择日期作为日期并使用应用程序代码对其进行格式化。
  • 如果想要这样的功能,需要自己写。但即便如此,您也不能对两个 DBMS 使用相同的语法,因为 SQL Server always 需要完全限定的函数名(例如 select dbo.my_tochar(...) ..),而 Oracle 不需要(而且您通常不需要)有一个模式dbo 仅用于功能)。另一种选择是定义一个使用 DBMS 特定函数返回格式化日期的视图。

标签: sql sql-server oracle to-char


【解决方案1】:

即使乍一看来自两个不同供应商的 SQL 实现看起来很相似,但在处理现实生活中的企业应用程序时,您会偶然发现大量不同之处,而我只是在谈论 SQL,将 PL/SQL 与T-SQL 几乎没有任何相似之处。

当试图将两个数据库的使用减少到只使用通用功能时,您将失去很多功能,您还可以在文件系统上使用 txt 文件。

正如有人已经建议的那样,一个优雅的解决方案是将数据库中的列保留为 DATE 数据类型,并在位于数据库上方的应用程序代码中提取数据(如果有)。例如,在 Java 中,您会将数据库的 DATE 列映射到 java.sql.Date,无论该日期来自 Oracle 还是来自 SQL Server。

不过,如果您想从数据库中获取格式化数据,您可以创建单独的列来保存格式化日期,例如:

字段名 | FIELDNAME_YYYY | FIELDNAME_YYYYMMDD | FIELDNAME_DDMMYYYY

【讨论】:

  • 程序是一个接口。所以我设置输入格式的解决方案对我来说很好。该接口仅收集数据并将其写入输出文件。
【解决方案2】:

我认为没有常见的功能可以做你想做的事。 Oracle 支持用于提取日期部分的 ANSI 标准 extract() 函数。 SQL Server 为YEAR()MONTH()DAY() 提供了单独的函数。甲骨文使用TO_CHAR(); SQL Server 使用CONVERT()

一种选择是在 Oracle 中定义函数YEAR()MONTH()DAY(),然后使用字符串连接(通过CONCAT())函数来组合数据。或者,在每个数据库中为您想要执行的操作编写特定函数。或者,也许有人在 SQL Server 中实现了TO_CHAR(),您可以从网上获取代码。

【讨论】:

    【解决方案3】:

    终于找到了解决办法。也许它对其他人也有用。

    您可以设置日期的输入格式...

    甲骨文:ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YYYY' SQL 服务器:SET DATEFORMAT dmy

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      相关资源
      最近更新 更多