Как мы можем использовать H2 для тестирования кода SQL Server, который включает преобразование даты в строку?

#date #sql-server-2012 #string-formatting #h2

#Дата #sql-server-2012 #форматирование строки #h2

Вопрос:

Мы используем ядро базы данных H2 как часть нашего инструментария тестирования для продукта, который использует SQL Server 2012 в производстве. Некоторые из существующих представлений SQL используют функцию ПРЕОБРАЗОВАНИЯ с тремя аргументами для дат, чтобы форматировать их как «каноническую» дату ODBC:

 CONVERT(VARCHAR, some_date, 120)
  

Обычно, когда мы сталкиваемся с подобной ситуацией, мы делаем одно из следующих двух действий:

  1. мы заменяем SQL чем-то переносимым, что работает в MS SQL и H2
  2. мы реализуем функцию JAVA для соответствия поведению MS SQL и отображаем ее как UDF в H2

На данный момент оба варианта, похоже, нас подводят, поскольку MS SQL, похоже, не предлагает альтернативный способ форматирования дат и CONVERT уже является функцией в H2, просто не в форме с тремя аргументами.

Похоже, у нас осталось два варианта, которые нам не очень нравятся:

  1. добавьте слой in-direction с обеих сторон, определив UDF в MS SQL, который запускает преобразование, с соответствующим в H2,
  2. исправление H2

Проблема с первым заключается в том, что он вводит в производство что-то, предназначенное исключительно для тестирования. В некоторой степени это верно и для перехода на более переносимый SQL, но добавление UDF — это еще один шаг вперед.

Исправление H2 может быть вариантом, но трудно сказать, сколько усилий это потребует, в частности, учитывая существующую CONVERT функцию. Если это подходит для более широкой аудитории, нам пришлось бы также разумным образом охватить странный мир стилей MS SQL по типам, тогда как нам нужен только один стиль для дат.

Есть ли другой способ? Есть ли у кого-нибудь опыт решения этой проблемы?

Комментарии:

1. Какая версия SQL Server? В SQL 2012 есть функция форматирования. Я не совсем понимаю, что вы делаете. Вы конвертируете базу данных SQL Server в H2, чтобы протестировать ее в H2? Существуют другие способы форматирования дат без использования функции CONVERT, т.Е. Использовать DATEPART и CAST

2. @Nick. McDermaid это 2012 год — я отредактировал вопрос, чтобы отразить это. Что мы делаем, так это тестируем полный веб-стек поверх H2 вместо SQL Server, чтобы ускорить переход в известное состояние. Мы добавляем схему через Liquibase, возможно, загружаем некоторые данные через SQL, затем запускаем приложение и запускаем тесты Selenium против него.

3. Если вы создаете систему на SQL, но затем тестируете ее в H2, то, похоже, вы не тестируете систему? Я что-то здесь упускаю. PS Я изменил теги, чтобы сказать SQL 2012. Решит ли вашу проблему использование функций, отличных от CONVERT (FORMAT и / или CAST)? Наверняка существует несколько несоответствий функций между SQL Server и H2?

4. @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))
  

(это всего лишь пример и не содержит временных компонентов)