2017-04-02 1 views
1

SqlFunctions.DateName(またはその他のSqlFunctionsメソッド)で月を2桁で取得できますか?例:8月 - 私はこれらすべて試した"MM"のような月を取得するには、SqlFunctions.DateNameでどのような引数を使用する必要がありますか?

> "08":

test1 = SqlFunctions.DateName("MM", e.Date), 
    test2 = SqlFunctions.DateName("m", e.Date), 
    test3 = SqlFunctions.DateName("mm", e.Date), 

しかし、彼らはすべてのリターン "8月"

もありSqlFunctions.DatePartが、それは整数、例えばを返します。 SqlFunctions("mm", e.Date)は整数を返します。

答えて

2

あなたはこのようにそれを行うことができます。

.Select(c => DbFunctions.Right("00" + c.Date.Month, 2)) 

RIGHT(SQL関数)を返しますが、指定された文字列(この場合は2)から右端の文字をXと月が1桁を持っている場合、我々はそのように2ゼロで月を先頭に追加しました結果は "00x"なので、 "0x"が返され、月が2桁の場合、結果は "00xx"となり、 "xx"が返されます。

結果のSQLクエリは、単に次のようになります。ボーナスとして

RIGHT(N'00' + CASE WHEN (DATEPART (month, [Extent1].[Date]) IS NULL) 
    THEN N'' ELSE CAST(DATEPART (month, [Extent1].[Date]) 

、このコードは、特定のSQLサーバーではなく、他のプロバイダで動作します。

+0

Hehe、nice。私はいつもフォーマットとデータの問題を分けようとするので、私はこの分野に精通していないと思います。 –

0

これにはSqlFunctionsは必要ありません。あなたはこれがあなたにSqlFunctions.DatePartに似月の整数値を、与え

test1 = e.Date.Month 

使用することができます(実際には、それがSQLのDATEPART機能に翻訳されています)。先頭にゼロが付いた文字列に直接入力することはできません。なぜなら、要求されたToStringのオーバーロードをサポートしていないからです。

context.Data.Select(e => e.Date.Month) 
     .AsEnumerable().Select(s => s.ToString("00")) 

これを行うにはEFを強制的にかなり不自然な方法があります:あなたは、メモリ内にそれを行う必要があるでしょう

from t in Data 
let d = t.Date.Month.ToString() 
let d2 = d.Length == 1 ? "0" + d : d 
select d2 

しかし、あなたが生成されたSQLをチェックする必要があります。これはd2を選択するために生成されるものです:

CASE WHEN (1 = (CAST(LEN(CASE WHEN (DATEPART (month, [c].[Date]) IS NULL) THEN N'' ELSE CAST(DATEPART (month, [c].[Date]) AS nvarchar(max)) END) AS int))) THEN N'0' + CASE WHEN (CASE WHEN (DATEPART (month, [c].[Date]) IS NULL) THEN N'' ELSE CAST(DATEPART (month, [c].[Date]) AS nvarchar(max)) END IS NULL) THEN N'' WHEN (DATEPART (month, [c].[Date]) IS NULL) THEN N'' ELSE CAST(DATEPART (month, [c].[Date]) AS nvarchar(max)) END WHEN (DATEPART (month, [c].[Date]) IS NULL) THEN N'' ELSE CAST(DATEPART (month, [c].[Date]) AS nvarchar(max)) END AS [C1] 

(通常、私は、これは改行を追加することによって、より見やすくするために試してみたが、今、私は唯一のポイントを作りたいです)。

これはクエリオプティマイザの実際の問題である可能性がありますので、慎重に使用することはありません。

+0

LINQを使用して2桁の月を取得し、メモリ内でそれを実行することは絶対にありません。完全なLINQ-To-Entities(SQLクエリのみ) – sports

+0

生成されたSQLを破棄する非常に工夫された方法のみ。 –

+1

私はそれをするための非工芸的な方法を見つけたと思うし、あなたが興味を持っているかもしれないと思った。 – Evk

関連する問題