SQL Server: преобразование не удалось при преобразовании даты и / или времени из символа с строкой за 12 часов

Здесь он находится в Java:

import static java.lang.Math.round;
import static java.lang.Math.random;
import static java.lang.Math.pow;
import static java.lang.Math.abs;
import static java.lang.Math.min;
import static org.apache.commons.lang.StringUtils.leftPad

public class RandomAlphaNum {
  public static String gen(int length) {
    StringBuffer sb = new StringBuffer();
    for (int i = length; i > 0; i -= 12) {
      int n = min(12, abs(i));
      sb.append(leftPad(Long.toString(round(random() * pow(36, n)), 36), n, '0'));
    }
    return sb.toString();
  }
}

Вот пример:

scala> RandomAlphaNum.gen(42)
res3: java.lang.String = uja6snx21bswf9t89s00bxssu8g6qlu16ffzqaxxoy
0
задан Jaz 13 July 2018 в 15:42
поделиться

2 ответа

Если вы пытаетесь рассчитать время начала из строки в формате HHMMSS, этот метод кажется мне намного проще:

select cast(stuff(stuff(right('0000000' + str, 6), 5, 0, ':'), 3, 0, ':') as time)
from (values ('120609'), ('0'), ('1001')) v(str)
0
ответ дан Gordon Linoff 17 August 2018 в 12:31
поделиться
  • 1
    Спасибо, если я смогу заставить это работать, это, конечно, значительно сократит мой код. Я добавил пример в свой оригинальный вопрос о коде в действии, и я все еще получаю ту же ошибку. – Jaz 13 July 2018 в 15:43
  • 2
    @Jas. , , Тогда у вас, кажется, есть строка, которая недействительна как формат времени или та, которая превышает '250000'. Используйте try_cast(), если вы хотите избежать проблемы. – Gordon Linoff 14 July 2018 в 02:16

Это работает для меня:

SELECT
    h.step_id,
    CAST(j.[name] AS VARCHAR) as JobName,
    h.step_name,
    -- CAST(stuff(stuff(right('0000000' + h.run_time, 6), 5, 0, ':'), 3, 0, ':') as time)
     (h.run_time / 1000000) % 100 as hour,
       (h.run_time / 10000) % 100 as minute,
       (h.run_time / 100) % 100 as second,
       (h.run_time % 100) * 10 as millisecond,
       dateadd(hour, (h.run_time / 1000000) % 100, dateadd(minute, (h.run_time / 10000) % 100, dateadd(second, (h.run_time / 100) % 100, dateadd(millisecond, (h.run_time % 100) * 10, cast('00:00:00' as time(2)))))) 
FROM
    msdb.dbo.sysjobs j 
    INNER JOIN msdb.dbo.sysjobhistory h ON j.job_id = h.job_id 

Btw, CAST приводит к ошибке для меня, а также

Если вы не хотите использовать оператор select:

DECLARE @run_time INT
DECLARE @time_result TIME

SET @run_time = '120609'

SET @time_result = dateadd(hour, (@run_time / 1000000) % 100, dateadd(minute, (@run_time / 10000) % 100, dateadd(second, (@run_time / 100) % 100, dateadd(millisecond, (@run_time % 100) * 10, cast('00:00:00' as time(2)))))) 

select @time_result
0
ответ дан Matteo Avesani 17 August 2018 в 12:31
поделиться
  • 1
    Да, я посмотрел на это, и я попробовал. Но всякий раз, когда мое время работы составляло 47 секунд, оно отображается как 47 миллисекунд вместо этого. – Jaz 13 July 2018 в 15:52
  • 2
    попробуйте с этим кодом: select (@run_time / 1000000)% 100 как час, (@run_time / 10000)% 100 как минута, (@run_time / 100)% 100 в секундах, (@run_time% 100) * 10 как миллисекунда select dateadd (час, (@run_time / 1000000)% 100, dateadd (минута, (@run_time / 10000)% 100, dateadd (второй, (@run_time / 100)% 100, dateadd (миллисекунда, (@run_time% 100) * 10, cast ('00: 00: 00 'как время (2)))))) – Matteo Avesani 13 July 2018 в 15:56
  • 3
    Кроме того, с помощью этого кода, как я могу ссылаться на время выполнения в первом операторе select без инструкции from? – Jaz 13 July 2018 в 16:00
  • 4
    См. Мой новый ответ – Matteo Avesani 13 July 2018 в 16:15
Другие вопросы по тегам:

Похожие вопросы: