[英]How to Sum Price from 6:00am till next day 6:00am
我需要对当日6:00am
至次日凌晨6:00am
( 24hour
)的价格求和。 问题是,如果从6:00am
到24:00(00:00)
运行我的代码,如果从24:01
到6:00am
运行我的代码怎么办?
我应该为此创建两个例外,还是可以用一个代码运行它?
我的Sql
表包含一个DateTime
列。
var date = DateTime.Now;
if ((date.Hour>=6&& date.Minute >0) && (date.Hour <= 24 && date.Minute < 59))
{
}
else if ((date.Hour>=0&& date.Minute >0) && (date.Hour <= 5 && date.Minute < 59))
{
}
或者,如果我可以使用sql
查询立即完成操作?
SELECT SUM(sumtotal) from customertrans where DATEPART(HOUR, DateTime)>=6 and DATEPART(HOUR, DateTime)<=24 and DATEPART(HOUR, DateTime)=DATEPART(HOUR, GETDATE())
如果时间是从24:00
到6:00
我还需要添加前一天的从6:00
到24:00
在下面检查此方法:
var date = DateTime.Now;
if ((date.Hour >= 6 && date.Minute >= 0) && (date.Hour <= 23 && date.Minute <= 59))
{
SqlCommand cmd = new SqlCommand("Select sum(sumTotal) from customertrans where datetime>='" + DateTime.Now.ToString("MM/dd/yyyy") + "' and DateTime >= DATEPART(HOUR, '6:00') ", con);
string test = cmd.ExecuteScalar().ToString();
MessageBox.Show(test);
}
else if ((date.Hour >= 0 && date.Minute >= 0) && (date.Hour <= 5 && date.Minute <= 59))
{
SqlCommand cmd = new SqlCommand("Select sum(sumTotal) datetime from customertrans where datetime>='" + DateTime.Now.AddDays(-1).ToString("MM/dd/yyyy") + "' and DateTime >= DATEPART(HOUR, '6:00') ", con);
string test = cmd.ExecuteScalar().ToString();
MessageBox.Show(test);
}
从当日6:00 am至第二天6:00 am(24hour)
不对。 有些日子有23:00,有些日子有25:00,所以请记住这一点。 鉴于您是从C#调用的,因此我发现您正在使用DATEPART进行操作有点奇怪。 为什么不只对DateTime进行远程查询? 如果该字段已建立索引,则将避免进行表扫描。
为什么不这样:
TimeSpan cutoverTime = TimeSpan.FromHours(6); // or however you have this defined
// DateTime.Now is unstable, and the date may change between two consecutive calls
// so read it into a temporary variable
DateTime currentTime = DateTime.Now;
DateTime startTime = currentTime.Date.Add(cutoverTime); // guess today
if (startTime > currentTime)
{
// ok, guessed wrong, it was yesterday
startTime = startTime.AddDays(-1);
}
DateTime endTime = startTime.AddDays(1);
// And use parametised queries, not string concatenation (please)
// SELECT SUM(sumtotal) from customertrans where DateTime >= @startTime and DateTime < @endTime
进一步提请您注意,您可能需要考虑时区,也许是针对UTCNow做些事情。
在您的where语句中使用它。
WHERE date BETWEEN FORMAT(GETDATE(), 'MM/dd/yyyy') + ' 06:00' AND FORMAT(GETDATE() + 1, 'MM/dd/yyyy') + ' 06:00'
这将以MM/dd/yyyy
格式格式化当前日期,然后将上午6:00的时间附加到该日期(用于开始日期),然后执行相同的操作,但在其上加上1
(增加1
天)以获取明天的日期。
对于SQL 2008
您可以执行以下操作:
where date BETWEEN CONVERT(VARCHAR(10), GETDATE(), 110) + ' 06:00' AND CONVERT(VARCHAR(10), GETDATE() + 1, 110) + ' 06:00'
你可以试试这个
DateTime start = date.Date.AddHours(6);
if ((date.Hour >= 6 && date.Minute >= 0) && (date.Hour <= 23 && date.Minute <= 59))
{
sum = Sum(start, start.AddDays(1));
}
else if ((date.Hour >= 0 && date.Minute >= 0) && (date.Hour <= 5 && date.Minute <= 59))
{
sum = Sum(start.AddDays(-1), start);
}
您的sum方法声明如下
public int Sum(DateTime start, DateTime end)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.