DATEADD, используя десятичную - обходные пути? - PullRequest
2 голосов
/ 24 ноября 2011

Я пытаюсь сделать что-то вроде ниже (я упростил задачу, чтобы попытаться решить эту отдельную часть).

PRINT DATEADD(week, 0.2,  GETDATE())

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

Я пытаюсь придумать способ преобразования 0,2 в число часов, а затем использовать что-то вроде (я в порядке с точностью до часа).

PRINT DATEADD(hour, X,  GETDATE())

Есть идеи, как начать? Мне сложно найти что-либо, чтобы получить десятичное представление одной части даты в другой части даты.

Это должен быть набор запросов на основе производительности.

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

Ответы [ 2 ]

6 голосов
/ 24 ноября 2011

1 неделя = 7 дней = 168 часов = 10080 минут

0,2 недели = 2016 минут

PRINT DATEADD(minute, 2016, GETDATE())

Чтобы это работало годами, вы могли бынапишите User Defined Function, где вы можете ввести десятичное число лет, а затем умножить это на минуты, и запустить DATEADD, используя minutes

0 голосов
/ 24 ноября 2011

Это то, что я придумал, если оно пригодится кому-либо. Курт помог мне открыть глаза на то, что моя проблема на самом деле не так сложна, как я сначала думал. Я отметил ответ Курта как решение, но вот пример кода. Примечательно, что 10% не было в моем первоначальном вопросе, но это показывает, почему мне нужны десятичные дроби.

DECLARE @DatePart int,
        @DateNumber int;

SET @DatePart = 1
SET @DateNumber = 1                         

PRINT
    DATEADD(
                hour,
                CEILING
                (           
                    CASE @DatePart
                        WHEN 1 THEN @DateNumber * 24.000000 --days
                        WHEN 2 THEN @DateNumber * 168.000000 --weeks
                        WHEN 3 THEN @DateNumber * 730.484398 --months
                        WHEN 4 THEN @DateNumber * 8765.81277 --years
                    END / 100.000000 * 10.000000
                ),
                GETDATE()
            ) 
...