如何获取 Datetimeoffset 的值月份?
How do I get the value month of Datetimeoffset?
我有一个包含 datetimeoffset 的数据列表?作为里面的一列。我想获取具有所需月份但不知道如何获取的特定数据。下面是我试过的那些代码。
这个 return 我有 No overload for method 'Tostring'
的错误,这很奇怪,因为我可以传递 datetimeoffset?并在其他功能中使用它,但如果我直接在获取它的地方进行操作,我将无法使用它。
int d = DateTime.Now.Month;
string f = d.ToString();
var s = _dbContext.Documents.FirstOrDefault(x => x.ApplyDate.ToString("MM") == f);
return Json(s);
这个return空
int d = DateTime.Now.Month;
string f = d.ToString();
var s = _dbContext.Documents.FirstOrDefault(x => x.ApplyDate.Value.ToString("MM") == f);
return Json(s);
您可以像这样检索可为 null 的 datetimeoffset 的月份:
DateTimeOffset? dt;
dt?.Value.Month;
但是,我真的很想知道 EF 是否能够翻译这个:
x => x.ApplyDate?.Month == f
转换为 SQL 表达式。我认为它将回退到内存中过滤。
其次,即使 EF 能够将其转换为 SQL 表达式,它也不是最佳的,因为可能不会使用可能在该列上定义的索引。
因此,我建议将您的 LINQ 表达式重写为如下内容:
x :> x.ApplyDate != null && x.ApplyDate >= new DateTimeOffset(someDate.Year, someDate.Month, 1) && x.ApplyDate <= new DateTimeOffset(someDate.Year, someDate.Month, daysInMonth)
(假设你想检索属于特定年份的特定月份的数据。如果你想检索属于某个月份的记录,而不考虑年份,我看没有其他选择)
DateTimeOffset?
是 Nullable
类型,因此没有像 DateTimeOffset
那样重载 ToString(string format)
。
要从您的 DateTimeOffset?
中获取月份值,您可以
x.ApplyDate.Value.ToString("MM"
)
x.ApplyDate.Value.Month
请考虑您可能想要检查 ApplyDate.Value
是否为空 在 获取它的月份 属性
之前
您上面的代码显示的是 DateTime,而不是 DateTimeOffSet。
DateTimeOffSet 是 Struct,如果你有一个 nullable 值,你需要先检查值然后 从值部分得到月份
DateTimeOffSet myNullableDateTime = someValue...//
选项 1:
// notice I added value below
myNullableDateTime.HasValue? "?Month="+myNullableDateTime.EscapeDataString(myNullableDateTime.Value.ToString()):"")
选项 2:
if(myNullableDateTime.HasValue)
{
var Month = myNullableDateTime.Month
TimeSpan difference = DateTimeOffset.Now.Subtract(myNullableDateTime.Value);
// convert the difference to what you need and get Month
}
我还没有编译它,但它应该给你答案或非常接近。
我有一个包含 datetimeoffset 的数据列表?作为里面的一列。我想获取具有所需月份但不知道如何获取的特定数据。下面是我试过的那些代码。
这个 return 我有 No overload for method 'Tostring'
的错误,这很奇怪,因为我可以传递 datetimeoffset?并在其他功能中使用它,但如果我直接在获取它的地方进行操作,我将无法使用它。
int d = DateTime.Now.Month;
string f = d.ToString();
var s = _dbContext.Documents.FirstOrDefault(x => x.ApplyDate.ToString("MM") == f);
return Json(s);
这个return空
int d = DateTime.Now.Month;
string f = d.ToString();
var s = _dbContext.Documents.FirstOrDefault(x => x.ApplyDate.Value.ToString("MM") == f);
return Json(s);
您可以像这样检索可为 null 的 datetimeoffset 的月份:
DateTimeOffset? dt;
dt?.Value.Month;
但是,我真的很想知道 EF 是否能够翻译这个:
x => x.ApplyDate?.Month == f
转换为 SQL 表达式。我认为它将回退到内存中过滤。 其次,即使 EF 能够将其转换为 SQL 表达式,它也不是最佳的,因为可能不会使用可能在该列上定义的索引。
因此,我建议将您的 LINQ 表达式重写为如下内容:
x :> x.ApplyDate != null && x.ApplyDate >= new DateTimeOffset(someDate.Year, someDate.Month, 1) && x.ApplyDate <= new DateTimeOffset(someDate.Year, someDate.Month, daysInMonth)
(假设你想检索属于特定年份的特定月份的数据。如果你想检索属于某个月份的记录,而不考虑年份,我看没有其他选择)
DateTimeOffset?
是 Nullable
类型,因此没有像 DateTimeOffset
那样重载 ToString(string format)
。
要从您的 DateTimeOffset?
中获取月份值,您可以
x.ApplyDate.Value.ToString("MM"
)x.ApplyDate.Value.Month
请考虑您可能想要检查 ApplyDate.Value
是否为空 在 获取它的月份 属性
您上面的代码显示的是 DateTime,而不是 DateTimeOffSet。
DateTimeOffSet 是 Struct,如果你有一个 nullable 值,你需要先检查值然后 从值部分得到月份
DateTimeOffSet myNullableDateTime = someValue...//
选项 1:
// notice I added value below
myNullableDateTime.HasValue? "?Month="+myNullableDateTime.EscapeDataString(myNullableDateTime.Value.ToString()):"")
选项 2:
if(myNullableDateTime.HasValue)
{
var Month = myNullableDateTime.Month
TimeSpan difference = DateTimeOffset.Now.Subtract(myNullableDateTime.Value);
// convert the difference to what you need and get Month
}
我还没有编译它,但它应该给你答案或非常接近。