Каталог решений - Заметки по SQL 4: Преобразование в запросе строки в дату одним выражением

Заметки по SQL 4: Преобразование в запросе строки в дату одним выражением

Заметки по SQL 4: Преобразование в запросе строки в дату одним выражением

В наличии

На «Инфостарте» есть несколько статей, описывающих преобразование строки в дату. Описанное в них преобразование осуществляется в несколько запросов и имеет сложные для понимания выражения. В статье описано относительно простое выражение в запросе, преобразующее строку в дату.

Категория:

Описание

Для более простого понимания принципа преобразования, вначале, разобьем выражение на несколько запросов, а затем приведем преобразование к одному выражению.

  //Собственно, первый запрос это ввод строки даты и разбиение ее на года, месяца и даты
  ВЫБРАТЬ
  	ПОДСТРОКА("20210816", 1, 4) КАК Год,
  	ПОДСТРОКА("20210816", 5, 2) КАК Месяц,
  	ПОДСТРОКА("20210816", 7, 2) КАК Число
  ПОМЕСТИТЬ ВременнаяТаблица
  ;
  
  ////////////////////////////////////////////////////////////////////////////////
  ВЫБРАТЬ
  // Поскольку работать мы будем в текущем тысячелетии, то стазу добавим в сумму годов 2000
  // В результате диапазон преобразуемых лет, в данном примере будет 2000-2099,
  // возможно к этому времени 2099 фирма 1с напишет собственную функцию
  	2000 + 
  //Преобразуем строчное значение числа с десятилетиями в число и умножаем на весовой коэффициент 10 
          ВЫБОР
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Год, 3, 1) = "1"
  			ТОГДА 1
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Год, 3, 1) = "2"
  			ТОГДА 2
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Год, 3, 1) = "3"
  			ТОГДА 3
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Год, 3, 1) = "4"
  			ТОГДА 4
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Год, 3, 1) = "5"
  			ТОГДА 5
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Год, 3, 1) = "6"
  			ТОГДА 6
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Год, 3, 1) = "7"
  			ТОГДА 7
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Год, 3, 1) = "8"
  			ТОГДА 8
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Год, 3, 1) = "9"
  			ТОГДА 9
  		ИНАЧЕ 0
  	КОНЕЦ * 10 + 
  //Преобразуем строчное значение числа с единицами лет в число 
      ВЫБОР
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Год, 4, 1) = "1"
  			ТОГДА 1
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Год, 4, 1) = "2"
  			ТОГДА 2
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Год, 4, 1) = "3"
  			ТОГДА 3
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Год, 4, 1) = "4"
  			ТОГДА 4
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Год, 4, 1) = "5"
  			ТОГДА 5
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Год, 4, 1) = "6"
  			ТОГДА 6
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Год, 4, 1) = "7"
  			ТОГДА 7
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Год, 4, 1) = "8"
  			ТОГДА 8
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Год, 4, 1) = "9"
  			ТОГДА 9
  		ИНАЧЕ 0
  //Отнимаем от конечного числа 1
  	КОНЕЦ - 1 КАК Год,
  
  //Преобразуем строчное значение десятков месяцев в число и умножаем на весовой коэффициент 10 
  //Поскольку десятков месяцев не может быть больше 10, то и преобразование короткое
  	ВЫБОР
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Месяц, 1, 1) = "1"
  			ТОГДА 1
  		ИНАЧЕ 0
  	КОНЕЦ * 10 + 
  //Преобразуем строчное значение числа с единицами месяцев в число 
      ВЫБОР
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Месяц, 2, 1) = "1"
  			ТОГДА 1
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Месяц, 2, 1) = "2"
  			ТОГДА 
          КОГДА ПОДСТРОКА(ВременнаяТаблица.Месяц, 2, 1) = "3"
  			ТОГДА 3
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Месяц, 2, 1) = "4"
  			ТОГДА 4
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Месяц, 2, 1) = "5"
  			ТОГДА 5
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Месяц, 2, 1) = "6"
  			ТОГДА 6
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Месяц, 2, 1) = "7"
  			ТОГДА 7
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Месяц, 2, 1) = "8"
  			ТОГДА 8
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Месяц, 2, 1) = "9"
  			ТОГДА 9
  		ИНАЧЕ 0
  	КОНЕЦ - 1 КАК Месяц,
  
  //Преобразуем строчное значение десятков дней в число и умножаем на весовой коэффициент 10 
  //Поскольку десятков дней не может быть больше 30, то и преобразование проводится до 3-х единиц
  	ВЫБОР
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Число, 1, 1) = "1"
  			ТОГДА 1
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Число, 1, 1) = "2"
  			ТОГДА 2
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Число, 1, 1) = "3"
  			ТОГДА 3
  		ИНАЧЕ 0
  	КОНЕЦ * 10 + 
  //Преобразуем строчное значение дней в число, стандартно  
      ВЫБОР
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Число, 2, 1) = "1"
  			ТОГДА 1
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Число, 2, 1) = "2"
  			ТОГДА 2
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Число, 2, 1) = "3"
  			ТОГДА 3
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Число, 2, 1) = "4"
  			ТОГДА 4
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Число, 2, 1) = "5"
  			ТОГДА 5
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Число, 2, 1) = "6"
  			ТОГДА 6
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Число, 2, 1) = "7"
  			ТОГДА 7
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Число, 2, 1) = "8"
  			ТОГДА 8
  		КОГДА ПОДСТРОКА(ВременнаяТаблица.Число, 2, 1) = "9"
  			ТОГДА 9
  		ИНАЧЕ 0
  	КОНЕЦ - 1 КАК День
  ПОМЕСТИТЬ ВременнаяТаблица1
  ИЗ
  	ВременнаяТаблица КАК ВременнаяТаблица
  ;
  
  ////////////////////////////////////////////////////////////////////////////////
  ВЫБРАТЬ
  //Итоговое выражение преобразование выглядит следующим образом
  //Поскольку итоговая дата формируется 
  //как Дата 0001.01.01 + Число лет + число месяцев + число дней
  //становится понятным для чено мы отнимали от итоговых сумм годов, месяцев, и дней 1 единицу
  
  	ДОБАВИТЬКДАТЕ(
      ДОБАВИТЬКДАТЕ(
      ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), ГОД,   ВременнаяТаблица1.Год), 
                                        МЕСЯЦ, ВременнаяТаблица1.Месяц), 
                                        ДЕНЬ,  ВременнаяТаблица1.День) КАК Дата
  ИЗ
  	ВременнаяТаблица1 КАК ВременнаяТаблица1

Приведем итоговый запрос с выражением преобразования строки в дату.

  ВЫБРАТЬ
  	ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), 
          ГОД, 2000 + ВЫБОР
  					КОГДА ПОДСТРОКА(&СтрокаДата, 3, 1) = "1"
  						ТОГДА 1
  					КОГДА ПОДСТРОКА(&СтрокаДата, 3, 1) = "2"
  						ТОГДА 2
  					КОГДА ПОДСТРОКА(&СтрокаДата, 3, 1) = "3"
  						ТОГДА 3
  					КОГДА ПОДСТРОКА(&СтрокаДата, 3, 1) = "4"
  						ТОГДА 4
  					КОГДА ПОДСТРОКА(&СтрокаДата, 3, 1) = "5"
  						ТОГДА 5
  					КОГДА ПОДСТРОКА(&СтрокаДата, 3, 1) = "6"
  						ТОГДА 6
  					КОГДА ПОДСТРОКА(&СтрокаДата, 3, 1) = "7"
  						ТОГДА 7
  					КОГДА ПОДСТРОКА(&СтрокаДата, 3, 1) = "8"
  						ТОГДА 8
  					КОГДА ПОДСТРОКА(&СтрокаДата, 3, 1) = "9"
  						ТОГДА 9
  					ИНАЧЕ 0
  				КОНЕЦ * 10 + ВЫБОР
  					КОГДА ПОДСТРОКА(&СтрокаДата, 4, 1) = "1"
  						ТОГДА 1
  					КОГДА ПОДСТРОКА(&СтрокаДата, 4, 1) = "2"
  						ТОГДА 2
  					КОГДА ПОДСТРОКА(&СтрокаДата, 4, 1) = "3"
  						ТОГДА 3
  					КОГДА ПОДСТРОКА(&СтрокаДата, 4, 1) = "4"
  						ТОГДА 4
  					КОГДА ПОДСТРОКА(&СтрокаДата, 4, 1) = "5"
  						ТОГДА 5
  					КОГДА ПОДСТРОКА(&СтрокаДата, 4, 1) = "6"
  						ТОГДА 6
  					КОГДА ПОДСТРОКА(&СтрокаДата, 4, 1) = "7"
  						ТОГДА 7
  					КОГДА ПОДСТРОКА(&СтрокаДата, 4, 1) = "8"
  						ТОГДА 8
  					КОГДА ПОДСТРОКА(&СтрокаДата, 4, 1) = "9"
  						ТОГДА 9
  					ИНАЧЕ 0
  				КОНЕЦ - 1), 
           МЕСЯЦ, ВЫБОР
  				КОГДА ПОДСТРОКА(&СтрокаДата, 5, 1) = "1"
  					ТОГДА 1
  				ИНАЧЕ 0
  			КОНЕЦ * 10 + ВЫБОР
  				КОГДА ПОДСТРОКА(&СтрокаДата, 6, 1) = "1"
  					ТОГДА 1
  				КОГДА ПОДСТРОКА(&СтрокаДата, 6, 1) = "2"
  					ТОГДА 2
  				КОГДА ПОДСТРОКА(&СтрокаДата, 6, 1) = "3"
  					ТОГДА 3
  				КОГДА ПОДСТРОКА(&СтрокаДата, 6, 1) = "4"
  					ТОГДА 4
  				КОГДА ПОДСТРОКА(&СтрокаДата, 6, 1) = "5"
  					ТОГДА 5
  				КОГДА ПОДСТРОКА(&СтрокаДата, 6, 1) = "6"
  					ТОГДА 6
  				КОГДА ПОДСТРОКА(&СтрокаДата, 6, 1) = "7"
  					ТОГДА 7
  				КОГДА ПОДСТРОКА(&СтрокаДата, 6, 1) = "8"
  					ТОГДА 8
  				КОГДА ПОДСТРОКА(&СтрокаДата, 6, 1) = "9"
  					ТОГДА 9
  				ИНАЧЕ 0
  			КОНЕЦ - 1), 
          ДЕНЬ, ВЫБОР
  			КОГДА ПОДСТРОКА(&СтрокаДата, 7, 1) = "1"
  				ТОГДА 1
  			КОГДА ПОДСТРОКА(&СтрокаДата, 7, 1) = "2"
  				ТОГДА 2  
  			КОГДА ПОДСТРОКА(&СтрокаДата, 7, 1) = "3"
  				ТОГДА 3
  			ИНАЧЕ 0
  		КОНЕЦ * 10 + ВЫБОР
  			КОГДА ПОДСТРОКА(&СтрокаДата, 8, 1) = "1"
  				ТОГДА 1
  			КОГДА ПОДСТРОКА(&СтрокаДата, 8, 1) = "2"
  				ТОГДА 2
  			КОГДА ПОДСТРОКА(&СтрокаДата, 8, 1) = "3"
  				ТОГДА 3
  			КОГДА ПОДСТРОКА(&СтрокаДата, 8, 1) = "4"
  				ТОГДА 4
  			КОГДА ПОДСТРОКА(&СтрокаДата, 8, 1) = "5"
  				ТОГДА 5
  			КОГДА ПОДСТРОКА(&СтрокаДата, 8, 1) = "6"
  				ТОГДА 6
  			КОГДА ПОДСТРОКА(&СтрокаДата, 8, 1) = "7"
  				ТОГДА 7
  			КОГДА ПОДСТРОКА(&СтрокаДата, 8, 1) = "8"
  				ТОГДА 8
  			КОГДА ПОДСТРОКА(&СтрокаДата, 8, 1) = "9"
  				ТОГДА 9
  			ИНАЧЕ 0
  		КОНЕЦ - 1) КАК ДатаПреобразования

В примере в качестве параметра выступает строка "20210816". Зная принцип преобразования можно переделать запрос под строку "16.08.2021" или "16.08.21". По аналогичному принципу можно преобразовать часы, минуты, секунды. Вместо параметра может выступать любое поле данных имеющее тип "Строка".

В случае строки неограниченной длинны, возможно необходимо  будет произвести следующее преобразование-

  ВЫРАЗИТЬ(Данные.СтрокаДата КАК СТРОКА(8)) КАК СтрокаДата
  // Где 8 - это количество символов СтрокаДата 

Тестирование проводилось на платформе 1С:Предприятие 8.3 (8.3.16.1063).

has been added to your cart:
Оформление заказа