SQL создает значение DateTime из года и квартала - PullRequest
5 голосов
/ 18 мая 2011

Я знаю год и квартал (например, «2010» и «4») для этапа, связанного с расписанием, и я хочу выбрать / создать дату и время из него.Есть несколько изящных способов идентифицировать квартал с помощью форматов («qq») определенной даты, но не наоборот (или есть?).Это для t-sql / SQL Server.

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

ОБНОВЛЕНИЕ: ВотРешение, которое я в итоге использовал, любезно предоставив gbn, с именами переменных AaronLS, а затем укороченное и подслащенное предложением Фрэнка Калиса :-) Было важно протестировать все 4 квартала, чтобы убедиться, что год обработан правильно.Спасибо всем, кто ответил!

DECLARE @TheQuarter INT
DECLARE @theYear INT
-- Note: qq = q = quarter for the datepart
SET @TheQuarter = 1
SET @TheYear = 2011
SELECT DATEADD(YEAR, @TheYear-1900, DATEADD(qq, @TheQuarter, -1))
-- 2011-03-31 00:00:00.000

SET @TheQuarter = 2
SET @TheYear = 2011
SELECT DATEADD(YEAR, @TheYear-1900, DATEADD(qq, @TheQuarter, -1))
-- 2011-06-30 00:00:00.000

SET @TheQuarter = 3
SET @TheYear = 2011
SELECT DATEADD(YEAR, @TheYear-1900, DATEADD(qq, @TheQuarter, -1))
-- 2011-09-30 00:00:00.000

SET @TheQuarter = 4
SET @TheYear = 2011
SELECT DATEADD(YEAR, @TheYear-1900, DATEADD(qq, @TheQuarter, -1))
-- 2011-12-31 00:00:00.000

Вот несколько вопросов, которые выбирают квартал от даты, но не наоборот: Рассчитайте последний день в текущем квартале ; Рассчитать последний день квартала ; Лучший способ хранить квартал и год в SQL Server?

Ответы [ 4 ]

9 голосов
/ 18 мая 2011

Никогда не используйте строки для преобразования даты и времени: слишком много, чтобы ошибиться с форматами, языком и т. Д.

Держите его в типе даты и времени ...

Select dateadd(day, -1, 
                       dateadd(year, @year-1900,
                                          dateadd(quarter, @qq, 0)
                                     )
             )
4 голосов
/ 18 мая 2011

Похоже, вы уже нашли свое решение, но только ради него ... Если вы выберете другую базовую дату, вы можете сократить все до

SELECT DATEADD(YEAR, @TheYear-1900, DATEADD(qq, @TheQuarter, -1))

, поскольку 0 указываетБазовая дата SQL Server - 01.01.1900 (и первый день месяца), при этом -1 в качестве базовой даты начинается на 1 день раньше, и тогда у вас уже есть последний день месяца (и конец квартала).Тогда вам просто нужно сделать оставшуюся часть времени и волшебства вуаля.

2 голосов
/ 18 мая 2011

Просто выберите дату из квартала:

select
    case @theQuarter
        when 1 then '3/31/' + cast(@theYear as varchar(4))
        when 2 then '6/30/' + cast(@theYear as varchar(4))
        when 3 then '9/30/' + cast(@theYear as varchar(4))
        when 4 then '12/31/' + cast(@theYear as varchar(4))
    end as quarterDate

Редактировать : с поправкой на последний день квартала вместо первого дня.

1 голос
/ 18 мая 2011

Это в основном получает первый день следующего квартала, а затем вычитает один, чтобы у вас был последний день квартала, который вы хотели. (@theQuarter + 1) добавляет один к кварталу, затем *3 -2 получает первый месяц этого квартала, и % 12 требуется, когда к четвертому кварталу, потому что вы добавляете один к 4, чтобы получить 5, что дает вам 13, но вы действительно хотите 1, поэтому% позаботится об этом.

Наконец, после приведения всех к дате, у нас есть первый день следующего квартала, таким образом вычтите - 1 в конце, чтобы вычесть один день и получить последний день квартала, в который мы изначально положили.

declare @theQuarter as int;
set @theQuarter = 4;

declare @theYear as int;
set @theYear = 2009;

select 
cast(
  cast(
        ( (@theQuarter + 1) * 3 - 2) % 12 
  as varchar(2)) 
  + '-01-' 
  + cast( (@theYear + (((@theQuarter + 1) * 3 - 2)/ 12) ) as varchar(4))  
as datetime) - 1 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...