如何将昨天的日期分配给参数C#
Posted
技术标签:
【中文标题】如何将昨天的日期分配给参数C#【英文标题】:How to assign yesterday's date to a parameter C# 【发布时间】:2012-07-21 22:42:47 【问题描述】:我有一个将作为 Windows 计划任务运行的 C# 程序。该程序将加载、运行 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.. .
在查询中而不是在程序中这样做会更有意义吗?如果是这样,我将如何更改查询?
【问题讨论】:
不要使用 BETWEEN。请阅读sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/…和sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/… 【参考方案1】:如果你想输入查询本身:
select (date_trunc('day', NOW()) - INTERVAL '1 day'); -- Yesterday Start
select (date_trunc('day', NOW()) - INTERVAL '1 second'); -- Yesterday End
【讨论】:
那是 Oracle 的语法对吧?我相信问题是针对 SQL Server 的【参考方案2】:您也可以在 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()))))
【讨论】:
【参考方案3】:在处理日期间隔时不要使用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)
【讨论】:
我选择了这个......在收集数据时更干净。谢谢!【参考方案4】:这也可能有效,但存在性能缺陷:
DateTime yesterday = DateTime.Today;
Thread.Sleep(1000 * 60 * 60 * 24);
【讨论】:
【参考方案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 库,它包含一个数据类型专门用于表示一个日期(另一个表示“一天中的时间”)等。目标当然是使用日期和时间来阐明代码。如果没有,我就失败了!
【讨论】:
SQL Server 默认存储几分之一秒,所以 -1 秒不会修复它。最好通过第二天的开始并使用<
而不是<=
@Andomar:我只是在回答这个问题。这就是为什么我说 BETWEEN 实际上是<=
很痛苦。 Grr.【参考方案6】:
您应该始终使用参数化查询。
为了支持您正在寻找的内容,您可以将昨天的日期放入一个变量中并将该变量传递给您的参数。
【讨论】:
【参考方案7】:你可以用 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
。后者只能存储日期,因此您不必担心日期时间部分。
【讨论】:
使用Today
而不是Now
,您不需要进行“昨天开始”的计算。
这是SQL 2000,我会尝试C#中的建议。【参考方案8】:
我假设你们都在寻找这种方式
DateTime yesterdDaysDateTime = DateTime.Now.AddDays(-1);
【讨论】:
以上是关于如何将昨天的日期分配给参数C#的主要内容,如果未能解决你的问题,请参考以下文章
从 SQLite 数据库读取日期时间值并使用 WPF 将其分配给 C# 中的 datepicker