2012-06-08 3 views
1

У меня есть следующий SQL сниппет:проблемы преобразования DateTime в C#

WHERE YEAR(wo.audt_created_dttm) >= 2011 - 3 --narrows down to a year 
AND YEAR(wo.audt_created_dttm) >= 2006 -- bad data less than 2006 
AND wo.audt_created_dttm < DATEADD(mm, 1, CAST(CAST(1 * 3 as varchar) + '/01/' + CAST(2011 as varchar) as DateTime)) 

, которые я переводил в LINQ к SQL (для целей тестирования в LINQPad), как это:

int year = 2012, quarter = 1; 
DateTime timeframe = new DateTime(year, (quarter * 3), 01).AddMonths(1); 


where wo.Audt_created_dttm.Value.Year >= year - 3 && wo.Audt_created_dttm.Value.Year >= 2006 
    && wo.Audt_created_dttm < timeframe && (s.Id =="NM" || s.Id == "TH") && 
    (wo.Clsdt_date ?? new DateTime(3000, 01, 01)) < DateTime.Now 

Однако для Фактическое решение Я не хочу конкретно определять год или квартал. Я хочу, чтобы год и квартал были текущими.

За год, я пытался сделать это:

DateTime timeframe = new DateTime(timeframe.Year, (quarter * 3), 01).AddMonths(1); 

но компилятор не нравится, что на всех. Тогда я пробовал это:

DateTime setYear = new DateTime(); 
DateTime timeframe = new DateTime(setYear.Year, (quarter * 3), 01).AddMonths(1) 

, который тоже не работает. Я не понимаю, как сделать год или квартал, и был бы признателен за любые советы

+1

Как именно это не сработало? Что это сделал? – svick

+0

Пробовал свой код, кажется, работает без ошибок компиляции. – Magnus

+0

@ svick - Он отлично работал, если я сохранил данные за год и квартал и установил их на определенный год и квартал. Тем не менее, мне не нужен конкретный год или квартал. Я только специально установил их, чтобы проверить свой LINQ to SQL-код в LINQPad, чтобы обеспечить корректность моего вывода. Оба таймфрейма.Год и setYear.Year дал мне «полевой инициализатор не может ссылаться на нестатическое поле, метод или свойство« бла, бла, бла ». Я нашел ответ. –

ответ

4

Я хочу год и квартал, чтобы быть текущим.

Чтобы получить первый день текущего квартала вы можете использовать этот код:

var now = DateTime.Now; 
var quarter = (now.Month - 1)/3; 
var timeframe = new DateTime(now.Year, 3*quarter + 1, 1); 

timeframe будет содержать 2012-04-01, 2012-07-01, 2012-10-01 и т.д. в зависимости от текущей даты.

+0

@ Martin Liversage: Большое спасибо за помощь! –

1

Вы хотите текущий год?

DateTime.Today.Year 
+0

@ bleeeah - Спасибо за помощь. –