如何将昨天的日期分配给参数C#

时间:2012-07-23 16:49:37

标签: c# sql-server datetime sql-server-2000

我有一个C#程序,它将作为Windows计划任务运行。该程序将加载,运行SQL查询,通过电子邮件发送存储在数据集中的结果,然后关闭。除了使用昨天的日期之外,我还有其他所有东西。

这是我目前的查询:

SELECT        Store_Id, Paid_Out_Amount, Paid_Out_Comment, Paid_Out_Datetime, Update_UserName, Till_Number, @startdate AS Start, @enddate AS Today
FROM            Paid_Out_Tb
WHERE        (Store_Id = 1929) AND (Paid_Out_Datetime BETWEEN @startdate AND @enddate)

显然我需要在查询时分配@startdate和@enddate。因为我需要12AM到1159PM这是开始和结束的原因。所以举个例子。如果我想今天运行该程序,它将在昨天(23日)进行搜索,因此@startdate将分配给7/22/12 00:00:00,@ enddate将被分配7/22/12 23:59:59 ..

在查询而不是程序中执行它会更有意义吗?如果是这样,我将如何更改查询?

8 个答案:

答案 0 :(得分:5)

对现有答案略有改进,总是在不必调用DateTime构造函数的情况下获得昨天的 start

var todayStart = DateTime.Today;
var yesterdayStart = todayStart.AddDays(-1);
var yesterdayEnd = todayStart.AddSeconds(-1); // Ick...

请注意,这将使用当前系统时区作为“今天”的含义 - 您确定这是您想要的吗?您可以考虑使用:

var todayUtcStart = DateTime.UtcNow.Date;
...

令人遗憾的是BETWEEN将终点视为包容性 - 如果它等同于

start <= value && value < end

然后你可以给两个午夜值,这将更加清晰。

另请注意,虽然它不会与数据库进行任何更清洁的交互,但对于其他使用的日期和时间,您可能希望考虑我的Noda Time库,其中包含数据类型专门用于表示日期(另一个用于“时间”)等。目标肯定是使用日期和时间来澄清代码。如果没有,我就失败了!

答案 1 :(得分:4)

你可以用C#计算昨天的开始:

var yesterday = DateTime.Now.AddDays(-1);
var startOfYesterday = new DateTime(yesterday.Year, yesterday.Day, yesterday.Month);
com.Parameters.AddWithValue("@enddate", startOfYesterday);

如果您使用的是SQL Server 2008+,则可以将数据类型从datetime更改为date。后者只能存储日期,因此您不必担心日期时间部分。

答案 2 :(得分:2)

处理日期间隔时请勿使用between。使用>=<会更容易,更安全。

这样的东西会给你昨天没有参数的东西。

SELECT Store_Id, Paid_Out_Amount, Paid_Out_Comment, Paid_Out_Datetime, Update_UserName, Till_Number, @startdate AS Start, @enddate AS Today
FROM   Paid_Out_Tb
WHERE  Store_Id = 1929 AND 
       Paid_Out_Datetime >= dateadd(day, datediff(day, 0, getdate())-1, 0) and
       Paid_Out_Datetime < dateadd(day, datediff(day, 0, getdate()), 0)

答案 3 :(得分:0)

我假设你们都在寻找这样的东西

DateTime yesterdDaysDateTime = DateTime.Now.AddDays(-1);

答案 4 :(得分:0)

您应始终使用参数化查询。

为了支持您所寻找的内容,您可以将昨天的日期放入变量并将该变量传递给您的参数。

答案 5 :(得分:0)

这可能也有效,但存在性能缺陷:

 DateTime yesterday = DateTime.Today;
 Thread.Sleep(1000 * 60 * 60 * 24);

答案 6 :(得分:0)

您也可以在SQL中执行此操作:

SELECT Store_Id, Paid_Out_Amount, Paid_Out_Comment, 
        Paid_Out_Datetime, Update_UserName, Till_Number, @startdate AS Start, @enddate AS Today
FROM            Paid_Out_Tb
WHERE        (Store_Id = 1929) 
AND (Paid_Out_Datetime BETWEEN DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) 
    AND dateadd(second, -1, DATEADD(dd, 1, DATEDIFF(dd, 0, GETDATE()))))

答案 7 :(得分:0)

如果您想放入查询本身:

select (date_trunc('day', NOW()) - INTERVAL '1 day'); -- Yesterday Start
select (date_trunc('day', NOW()) - INTERVAL '1 second'); -- Yesterday End