从T-SQL将datepart转换为LINQ

时间:2012-10-24 14:10:25

标签: linq tsql

我正试图从周日到周六获取上周和2周前的日期范围 所以今天是10/24/2012,日期范围是:10/21/2012 - 10/27/2012

我正试图获得上周的日期范围,即:10/14/2012 - 10/20/2012
此外,2周前的日期范围是:10/07/2012 - 10/13/2012

我有正确的SQL查询

DECLARE @TodayDayOfWeek INT
DECLARE @EndOfPrevWeek DateTime
DECLARE @StartOfPrevWeek DateTime
DECLARE @EndOf2WeeksAgo DateTime
DECLARE @Start2WeeksAgo DateTime


SET @TodayDayOfWeek = datepart(dw, GetDate())
--get the last day of the previous week (last Sunday)
SET @EndOfPrevWeek = DATEADD(dd, -@TodayDayOfWeek, GetDate())
--get the first day of the previous week (the Monday before last)
SET @StartOfPrevWeek = DATEADD(dd, -(@TodayDayOfWeek+6), GetDate())
SET @EndOf2WeeksAgo = DATEADD(dd, -(@TodayDayOfWeek+7), GetDate())
SET @Start2WeeksAgo = DATEADD(dd, -(@TodayDayOfWeek+13), GetDate())

Select  @StartOfPrevWeek as [Last week start date], @EndOfPrevWeek as [Last Week start date],
@Start2WeeksAgo as [2 Weeks Ago Start], @EndOf2WeeksAgo as [2 Weeks Ago End]    

这导致

[Last week start date] [Last week start date]  [2 Weeks Ago Start] [2 Weeks Ago End] 
10/14/2012             10/20/2012              10/07/2012          10/13/2012

如何将此转换为Linq?我有一个日期列,需要显示这两个日期范围之间的日期,如

last week date   2 weeks ago
10/15/2012        10/08/2012
10/18/2012        10/11/2012

1 个答案:

答案 0 :(得分:0)

以下是我编写的一个简单的控制台应用程序,它向您展示了完成任务的一种方法。只需根据您的需求进行调整......

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Test> testData = new List<Test>() {
                new Test() { Id = 1, Date = DateTime.Now.AddDays(-9) },
                new Test() { Id = 2, Date = DateTime.Now.AddDays(-8) },
                new Test() { Id = 3, Date = DateTime.Now.AddDays(-16) },
                new Test() { Id = 4, Date = DateTime.Now.AddDays(-14) },
                new Test() { Id = 5, Date = DateTime.Now.AddDays(-15) },
                new Test() { Id = 6, Date = DateTime.Now.AddDays(-10) },
                new Test() { Id = 7, Date = DateTime.Now.AddDays(-7) }
            };

              DateTime date = DateTime.Now; // 10/24/2012

              DateTime startOneWeekAgo =
                  // prev Sunday 10/14/2012 00:00
                  date.AddDays(-7).Date.AddDays(-(int)date.DayOfWeek),

                  // next Sunday 10/21/2012 00:00
                  endOneWeekAgo = startOneWeekAgo.AddDays(7);

              DateTime startTwoWeeksAgo =
                  // prev Sunday 10/07/2012 00:00
                  startOneWeekAgo.AddDays(-7),

                  // next Sunday 10/14/2012 00:00
                  endTwoWeeksAgo = endOneWeekAgo.AddDays(-7);

            var qryOneWeekAgo =
                            from record in testData
                            where record.Date >= startOneWeekAgo // include start
                            && record.Date < endOneWeekAgo // exclude end
                            select record;

            var qryTwoWeeksAgo =
                             from record in testData
                             where record.Date >= startTwoWeeksAgo // include start
                             && record.Date < endTwoWeeksAgo // exclude end
                             select record;

            Console.WriteLine("------- Dates from 1 Week Ago -------");
            foreach (var record in qryOneWeekAgo)
            {
                Console.WriteLine(
                    string.Format("{0} => {1}", record.Id, record.Date));
            }

            Console.WriteLine();

            Console.WriteLine("------- Dates from 2 Weeks Ago -------");
            foreach (var record in qryTwoWeeksAgo)
            {
                Console.WriteLine(
                    string.Format("{0} => {1}", record.Id, record.Date));
            }

            Console.ReadKey();

        }         
    }

    public class Test
    {
        public int Id { get; set; }
        public DateTime Date { get; set; }
    }

}

<强>输出

------- Dates from 1 Week Ago -------
1 => 10/15/2012 12:52:38 PM
2 => 10/16/2012 12:52:38 PM
6 => 10/14/2012 12:52:38 PM
7 => 10/17/2012 12:52:38 PM

------- Dates from 2 Weeks Ago -------
3 => 10/8/2012 12:52:38 PM
4 => 10/10/2012 12:52:38 PM
5 => 10/9/2012 12:52:38 PM