簡體   English   中英

Linq 2 Sql DateTime 格式到字符串 yyyy-MM-dd

[英]Linq 2 Sql DateTime format to string yyyy-MM-dd

基本上,我需要相當於 T-SQL CONVERT(NVARCHAR(10), datevalue, 126)

我試過了:

  1. from t in ctx.table select t.Date.ToString("yyyy-MM-dd")但它拋出不支持的異常
  2. from t in ctx.table select "" + t.Date.Year + "-" + t.Date.Month + "-" + t.Date.Day但我不認為這是一個可用的解決方案,因為我可能需要能夠改變格式。

我看到的唯一選擇是使用 Convert.ToString(t.Date, FormatProvider) ,但我需要一個格式提供程序,我不確定它是否有效

FormatProvider不工作的String.Format不工作( string.Format("{0:yyyy-MM-dd}", t.Date)拋出不支持例外太)。

如果其他人有這個問題,我通過創建一個單獨的函數來為我進行日期格式化來解決這個問題。

我的 Linq 看起來像這樣:

from a in context.table
where ...
select new Class
{
DateString = GetFormattedString(a.DateTimeObject)
}

而 GetFormattedString 只返回 DateTimeObject.ToString("yyyy-MM-dd"); 這對我有用!

假設 t.Date為空( DateTime? ),這可能是問題所在,請嘗試使用:

 
 
 
 
  
  
  from t in ctx.table select (t.HasValue ? t.Date.Value.ToString("yyyy-MM-dd") : string.Empty );
 
 
 

編輯:第二次嘗試

問題是翻譯成SQL; 它嘗試將.ToString()轉換為 SQL 表示,但失敗了。 因此,如果您應該執行以下操作,它應該可以工作:

(from t in ctx.table select t.Date).ToList().Select(d => d.ToString("yyyy-MM-dd"))

或者

(from t in ctx.table select t.Date).AsEnumerable().Select(d => d.ToString("yyyy-MM-dd"))

AsEnumerable()將之前使用的IQueryable轉換為IEnumerable ,從而停止 SQL 的生成(在 Linq 到 SQL 的情況下)或實現特定IQueryable的提供程序(例如 Linq 到 SQL 提供程序)的任何其他轉換。

請注意,在調用AsEnumerable()之前,您應該已完成要轉換為 SQL 並直接在數據庫上執行的任何操作。

是否有理由在數據庫端執行轉換? 每當我遇到這種情況時,我傾向於只讓數據庫給我原始數據,然后在應用程序中進行按摩和操作。 根據對數據庫服務器的請求量和結果集的大小,我不想將處理和響應時間用於客戶端可以處理的數據轉換。

看 3

var user = (from u in users
                     select new
                     {
                         name = u.name,
                         birthday = u.birthday.Value
                     })
                     .ToList()
                     .Select(x => new User()
                     {
                         name = x.name,
                         birthday = x.birthday.ToString("yyyyMMdd") // 0埋めされるよ
                     });

嘗試創建一個對象類,您可以設置屬性並讓屬性成為您的視圖的值.. 將 LINQ 中的日期時間數據設置為字符串而不是日期時間.. 例如。

//Property class
[DataContract()]
public class Info
{
[DataMember(Name = "created_date")]
public string CreateDate;
}


//Controller
var date = from p in dbContext.Person select p;
CreateDate = Convert.ToDateTime(p.create_date).ToString("yyyy-MM-dd");

希望你能試試這個.. 我在過去的申請中有這個,這就是我所做的。

我在報價網站上有一個全局搜索功能,我希望能夠從中搜索報價的所有詳細信息(報價參考、車輛詳細信息、客戶詳細信息等),包括僅使用單個輸入文本值的創建日期:

在此處輸入圖片說明

這意味着我絕對不想在嘗試將日期轉換為適當的字符串格式之前枚舉結果。

為了做到這一點,我想出了以下幾點:

// this is obviously only a fragment of my actual query
_context.Quotes
        .Where(q => string.Concat(
                      q.DateCreatedUtc.Day < 10 ? "0" : "", 
                      q.DateCreatedUtc.Day, 
                      "/", 
                      q.DateCreatedUtc.Month < 10 ? "0" : "", 
                      q.DateCreatedUtc.Month, 
                      "/", 
                      q.DateCreatedUtc.Year
                    )
                    .Contains(searchTerm));

我可以確認這會轉化為使用 EF Core V5 和 Pomelo V5 以及 MySql 數據庫的數據庫操作。

生成的 SQL 看起來像這樣:

WHERE
    LOCATE(@search_term, CONCAT(
        CASE WHEN EXTRACT(DAY FROM `quote`.`date_created_utc`) < 10 THEN '0' ELSE '' END,
        CAST(EXTRACT(DAY FROM `quote`.`date_created_utc`) AS CHAR),
        '/',
        CASE WHEN EXTRACT(MONTH FROM `quote`.`date_created_utc`) < 10 THEN '0' ELSE '' END,
        CAST(EXTRACT(MONTH FROM `quote`.`date_created_utc`) AS CHAR),
        '/',
        CAST(EXTRACT(YEAR FROM `quote`.`date_created_utc`) AS CHAR)
    )) > 0

整個查詢已經變成了一個科學怪人,我嚴重質疑允許用戶搜索日期的價值。

嘗試這個

var select = from s in db.Table
             where s.date == someDate
             select new 
             {
                date = DateTime.Parse(s.date.ToString()).ToString("yyyy-MM-dd"),
             };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM