2

Suppose I have a table storing a list of datetime (yyyyMMdd) in String format. How could I extract them and convert them into DateTime format dd/MM/yyyy ?

e.g. 20120101 -> 01/01/2012

I have tried the following:

var query = from tb in db.tb1 select new { dtNew = DateTime.ParseExact(tb.dt, "dd/MM/yyyy", null); };

But it turns out the error saying that the ParseExact function cannot be recgonized.

4

3 回答 3

8

通过以下方式在本地而不是在数据库中进行解析可能值得AsEnumerable

var query = db.tb1.Select(tb => tb.dt)
                  .AsEnumerable() // Do the rest of the processing locally
                  .Select(x => DateTime.ParseExact(x, "yyyyMMdd",
                                                CultureInfo.InvariantCulture));

初始选择是为了确保仅获取相关列,而不是整个实体(仅丢弃大部分实体)。我也避免使用匿名类型,因为这里似乎没有意义。

注意我是如何指定不变的文化的——你几乎肯定不想只使用当前的文化。而且我已经更改了用于解析的模式,因为听起来您的数据是yyyyMMdd格式的。

当然,如果可能的话,您应该更改数据库架构以将日期值存储在基于日期的列中,而不是作为文本。

于 2013-09-02T07:18:31.247 回答
1

如前所述,最好将日期作为日期类型列存储在数据库中,但如果您只想将字符串从一种格式转换为另一种格式,您可以这样做:

db.tb1.Select(x => String.Format("{0}/{1}/{2}", x.Substring(6, 2), x.Substring(4, 2), x.Substring(0, 4))
于 2013-09-02T07:28:00.880 回答
1

在 SQL Server 中创建一个 UDF,然后导入到您的 linq to sql 项目并在比较中使用

-- =============================================
-- Author:      
-- Create date: 
-- Description: Convert varchar to date
-- SELECT dbo.VarCharAsDate('11 May 2016 09:00')
-- =============================================
CREATE FUNCTION VarCharAsDate
(
    -- Add the parameters for the function here
    @DateAsVarchar NVarchar(100)
)
RETURNS DateTime
AS
BEGIN
    -- Declare the return variable here

    if IsDate(@DateAsVarchar) = 1 BEGIN
        -- Return the result of the function
        RETURN convert(datetime, @DateAsVarchar, 109)
    END
    RETURN NULL
END
GO

然后在代码中

.Where(p => ValueDateTime > db.VarCharAsDate(p.Value))
于 2016-05-16T09:44:26.210 回答