3

我有一个 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.. .

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

4

8 回答 8

5

对现有答案的轻微改进,总是可以昨天开始,而不必调用DateTime构造函数。

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库,它包含一个专门用于表示日期的数据类型(另一个用于“时间of day") 等。目的当然是使用日期和时间来阐明代码。如果没有,我就失败了!

于 2012-07-23T16:54:05.220 回答
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+,则可以将数据类型从 更改datetimedate. 后者只能存储日期,因此您不必担心日期时间部分。

于 2012-07-23T16:52:09.780 回答
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)
于 2012-07-23T17:03:06.623 回答
0

我假设你们都在寻找这种方式

DateTime yesterdDaysDateTime = DateTime.Now.AddDays(-1);
于 2012-07-23T16:51:59.187 回答
0

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

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

于 2012-07-23T16:53:55.793 回答
0

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

 DateTime yesterday = DateTime.Today;
 Thread.Sleep(1000 * 60 * 60 * 24);
于 2012-07-23T17:01:00.807 回答
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()))))
于 2012-07-23T17:04:04.923 回答
0

如果您想输入查询本身:

select (date_trunc('day', NOW()) - INTERVAL '1 day'); -- Yesterday Start
select (date_trunc('day', NOW()) - INTERVAL '1 second'); -- Yesterday End
于 2012-07-23T17:08:42.230 回答