我想做某一天的数据统计,我数据库是2016-08-04 15:00:00 2016-08-04 12:00:00的数据。我现在想统计这两条数据。我想的是转换时间成data。用sql可以使用date_format(UploadDate,'%c'),但是他们不允许这样的错误。我这样写都不行
_re.GetEntities(x =>x.CreateDate.GetValueOrDefault().Date==x.CreateDate.GetValueOrDefault().Date )
报错LINQ to Entities 不识别方法“System.DateTime ToDateTime(System.String)”,因此该方法无法转换为存储表达式。
想请问怎么应该怎么处理时间。把时分秒去掉,只留下日期!百度看见别人要在外面处理。但是这是在通过实体在数据库获取的数据。怎么在外面处理呢?
我是datatime?类型
这种你用大于小于时间区间不久好.干嘛非要取日期.直接>目标日期.小于目标日期加一天
你好。我获取的是全部的。所以只能在_re.GetEntities(x =>x.CreateDate.GetValueOrDefault().Date==x.CreateDate.GetValueOrDefault().Date )
这里操作。我的实体时间类型是datatime?。是不允许用tostring的。那请问怎么大于小于区间
@程序员一号: 其实你一直没说你的需求.所以大家都是在猜 .
我猜你是要查询某一天的数据.比如查询1号的所有记录.是这样吗?
@吴瑞祥: 是的。
就是我数据库里面日期是带时分秒的。我只想要知道这一天有多少数据。所以才问这么转换成日期。
@程序员一号: 那我前面已经说的非常清楚了.
_re.GetEntities(x => x.CreateDate>new DateTime(2008,1,1) &&x.CreateDate<new DateTime(2008,1,1).AddDay(1))
@吴瑞祥: 我现在就在试。如果后续还有请教你的地方,希望可以回答我。谢谢!
@吴瑞祥: 我采纳了你的方式。但是报错。
_repository.GetEntities(x=>x.CreateDate>=x.CreateDate.GetValueOrDefault().AddDays(-1).AddSeconds(1)&&x.CreateDate<=x.CreateDate.GetValueOrDefault().AddDays(1).AddSeconds(-1))
不识别方法“System.DateTime ToDateTime(System.String)”,因此该方法无法转换为存储表达式。
我现在去查为什么报这个错。但是大哥我这样写可行。或者有没有更好的方式
@程序员一号: 你为什么老要去处理字段值.你不是要查询某一个天的吗.为什么还要原字段值?
你重新你说你的业务需求吧.
@吴瑞祥 一图
:
二图
如上图所示。我想把一图那一天的统计成二图所示。这一天的时分秒的总结成这一天的日期。并统计出这一天有多少个source。所以我一直纠结怎么在原字段上处理
@程序员一号: 这种需求加字段和触发器解决啊.
添加更新日期字段.给默认值.然后在触发器中给更新日期赋值.不就好了
@吴瑞祥: 好吧!不好意思。我新手。不知道怎么弄。感谢。有没有简单的方式。
如楼上所说,自己先把参数弄好吧,自己在调用之前就格式化好。。。
真想用数据库函数,需要配置,挺麻烦的。。。
我就是不明白。怎么在调用之前格式好。╮(╯▽╰)╭。我弄了一天了。才来求助的
@程序员一号: 啊???
var date=x.CreateDate.GetValueOrDefault().Date;
_re.GetEntities(x =>x.CreateDate.GetValueOrDefault().Date==date);
这样不行?
@顾晓北: 这个x是调用这个方法得到的_re.GetEntities。只能在这个里面进行操作。具我所知,这样不行
@程序员一号: 哦,_re.GetEntities(x =>x.CreateDate==date);这样,如果你的createDate不单包括日期,还包括时间,那肯定是不能相等的,那就肯定是需要调用函数来转换,但时间一般都是选一个范围,所以你用>=和<=
@顾晓北: 嗯!尝试中。感谢。我才接触这个东西。所以不是很熟。
@顾晓北: 报错。我打算先去解决这个错误。
不识别方法“System.DateTime ToDateTime(System.String)”,因此该方法无法转换为存储表达式。
@程序员一号: 你是怎么写的?你现在还没明白么?linq最终还是转换成sql,sql中会有System.DateTime ToDateTime这个方法吗?
@顾晓北: 好吧。我知道了。我是看有人这样写过。
x.CreateDate.GetValueOrDefault().AddDays(1).AddSeconds(-1)我估计不能这样写吧。不能转换过来。
@程序员一号: 当然不能这么写,这么写在程序里是没有问题的,但linq是转换成sql在数据库里执行的,数据库里当然没有这个方法。。。
@顾晓北: 嗯。我想就是这样了。请问这种情况怎么解决呢。我组长让我自己弄,同事大牛都走了。剩下两个应届毕业生。所以希望能回答下。谢谢
@程序员一号: 。。。上面不是都跟你说了么?时间一般是范围选择,比如
xxx.GetEntitys(x=>x.CreateDate>=date.Date&&x.CreateDate<date.AddDays(1).Date)
@顾晓北: 这个意思明白。谢谢!真正努力发作
@程序员一号: 上面我怀疑也有点问题,
应该类似这样吧
var start=DateTime.Now.Date; var end=start.AddDays(1); xxx.GetEntitys(x=>x.CreateDate>=start&&x.CreateDate<end);
类似这样子,总之就是在调用之前,要么是可以翻译为sql的数据库表达式,比如子查询,要么就是实实在在的值。。。
@顾晓北: 是的。我现在换了种方式!暂时没报错。
x =>DbFunctions.TruncateTime(x.CreateDate)==DbFunctions.TruncateTime(x.CreateDate)
或者用HasValue判断是否有值,单独比较Year、Month、Day
谢谢。尝试下。
不识别方法“System.DateTime ToDateTime(System.String)”,因此该方法无法转换为存储表达式。
报这个错误。我先解决了这个错误了!╮(╯▽╰)╭。烦
@程序员一号: 检查下你的代码,看看什么地方用到ToDateTime方法了,改成别的方式。
@Don'tWorryBeHappy: 不行。我试了你的方式。不通过。估计像楼下说的linq转换sql的时候,不识别吧!
@程序员一号: x =>x.CreateDate.HasValue && x.CreateDate.Value.Year == x.CreateDate.Value.Year && x.CreateDate.Value.Month == x.CreateDate.Value.Month && x.CreateDate.Value.Day == x.CreateDate.Value.Day
类似这么写试过吗
@Don'tWorryBeHappy: 写过。执行通过了。但是最终输出的结果不对。我在看是不是我的问题
在linq to sql中,一些方法是不被识别的,一般有以下方法:
1.把参数提到外面先计算,例如:
var startDate = GetStartDate(…);
_re.GetEntities(x=>x.CreateDate>=startDate);
2.转化成能识别的操作
3.通过数据库函数
最后再指一下你写的问题,_re.GetEntities(x =>x.CreateDate.GetValueOrDefault().Date==x.CreateDate.GetValueOrDefault().Date )。x.CreateDate.GetValueOrDefault().Date==x.CreateDate.GetValueOrDefault().Date抛开其它不讲不是一直是true吗
我就是想试下是否能通过。可惜不行。参数无法提到外面,因为我获取的是全部。我尝试用了sqlfunction也不行。
就是报这个错不识别方法“System.DateTime ToDateTime(System.String)”,因此该方法无法转换为存储表达式。
@程序员一号: 全部指的是?关于function的详细使用,建议搜索linq to sql function
@jello chen: 数据表里面的全部数据。好的。谢谢