我们如何使用 H2 测试涉及日期到字符串转换的 SQL Server 代码?

Posted

技术标签:

【中文标题】我们如何使用 H2 测试涉及日期到字符串转换的 SQL Server 代码?【英文标题】:How can we use H2 to test SQL Server code that involves date to string conversions? 【发布时间】:2016-10-10 04:02:02 【问题描述】:

我们使用H2 database engine 作为我们在生产中使用 SQL Server 2012 的产品的测试工具的一部分。一些现有的 SQL 视图在日期上使用the three-argument CONVERT function 将它们格式化为“ODBC 规范”日期:

CONVERT(VARCHAR, some_date, 120)

通常当我们遇到这样的情况时,我们会做以下两件事之一:

    我们将 SQL 替换为在 MS SQL 和 H2 中工作的可移植的东西 我们实现了一个 JAVA 函数来匹配 MS SQL 的行为和map it as UDF into H2

目前两者似乎都让我们失望了,因为 MS SQL 似乎没有提供另一种格式化日期的方法,而且 CONVERT 已经是 H2 中的一个函数,只是不是三参数形式。

我们似乎只剩下两个我们不太喜欢的选择:

    通过在运行转换的 MS SQL 中定义一个 UDF,并在 H2 中定义一个对应的 UDF,在两侧添加一层间接, 补丁 H2

前者的问题在于,它会将一些仅用于测试的东西引入生产环境。在某种程度上,迁移到更便携的 SQL 也是如此,但添加 UDF 更进一步。

修补 H2 可能是一种选择,但很难说会付出多少努力,特别是考虑到现有的 CONVERT 功能。如果适合更广泛的受众,我们还必须以合理的方式涵盖 MS SQL 的怪异风格世界,而我们只追求一种风格。

还有其他方法吗?有没有人解决这个问题的经验?

【问题讨论】:

什么版本的 SQL Server? SQL 2012 具有 FORMAT 功能。我不太明白你在做什么。您是否将 SQL Server 数据库转换为 H2 以在 H2 中对其进行测试?还有其他方法可以在不使用 CONVERT 函数的情况下格式化日期,即使用 DATEPARTCAST @Nick.McDermaid 现在是 2012 年 - 我编辑了问题以反映这一点。我们所做的是在 H2 而不是 SQL Server 之上测试完整的 Web 堆栈,以加速进入已知状态。我们通过 Liquibase 添加模式,可能通过 SQL 加载一些数据,然后启动应用程序并针对它运行 Selenium 测试。 如果您在 SQL 中构建系统,然后在 H2 中对其进行测试,那么您似乎没有在测试系统?我在这里遗漏了一些东西。PS 我将标签更改为 SQL 2012。使用 CONVERT(FORMAT 和/或 CAST)以外的函数会解决您的问题吗? SQL Server 和 H2 之间肯定存在不止一种功能不匹配? @Nick.McDermaid SQL 只是整个系统的一小部分,H2 可以很好地模拟 SQL Server。它远非完美,但差距是可以理解的。这是一个权衡与将已知状态导入 SQL Server 数据库的成本。我们通常对缺少的函数做的是实现一个 UDF,这是第一个与现有函数发生冲突的函数。您提出的 FORMAT 函数可能会解决这个问题,H2 没有该名称的函数。 【参考方案1】:

使用 FORMAT 函数的等效结果是:

SELECT FORMAT(GETDATE(),'yyyy-MM-dd HH:mm:ss');

使用 FORMAT 函数而不是 CONVERT 似乎可以解决您的问题。

另一种不使用 CONVERT 的方法是:

SELECT 
CAST(YEAR(GETDATE()) AS VARCHAR(4)) + '-' + 
CAST(MONTH(GETDATE()) AS VARCHAR(2)) + '-' + 
CAST(DAY(GETDATE()) AS VARCHAR(2))

(这只是一个例子,不包含时间成分)

【讨论】:

以上是关于我们如何使用 H2 测试涉及日期到字符串转换的 SQL Server 代码?的主要内容,如果未能解决你的问题,请参考以下文章

H2 数据库。如何在sql中将日期转换为秒?

H2 将日期转换为毫秒

防止日期转换溢出

无法将大型数据集加载到 h2 数据库中

创建具有相同名称但不同签名的别名

将行转换为涉及日期的列