SQL Server 连接中的 nvarchar 或 varchar 或日期

Posted

技术标签:

【中文标题】SQL Server 连接中的 nvarchar 或 varchar 或日期【英文标题】:nvarchar or varchar or date in joins of SQL Server 【发布时间】:2018-01-21 08:52:38 【问题描述】:

我有一个使用 SQL Server 2008 R2 在 Web 中开发的管理项目和使用 SQL Server CE 4.0 的 Windows 应用程序。

两者都使用几乎相同的数据库结构。我有一张费用表:

TABLE [fees] 
(
    [feeid] bigint NOT NULL IDENTITY(1,1),
    [acno] int NULL DEFAULT 0,
    [billingmonth] nvarchar(10) NULL,
    [oldbal] numeric(18,2) NULL DEFAULT 0,
    [duedtamt] numeric(18,2) NULL DEFAULT 0,
    [afterdtamt] numeric(18,2) NULL DEFAULT 0, 
    [bal] numeric(18,2) NULL DEFAULT 0,
    [depamt] numeric(18,2) NULL DEFAULT 0,
    [totdpo] numeric(18,2) NULL DEFAULT 0,
    [depdt] datetime NULL
)

billingmonth 将始终使用MMM-yyyy 格式,例如。 2018 年 1 月

BillingMonth 在其他表中使用各种连接(内连接和左外连接)。

如何使用BillingMonth 提高连接性能? ,我应该:

将 nvarchar 转换为 varchar(因为它总是将 Month 存储在 SQL2008R2 中) 将 nvarchar 转换为 datetime(在 SQL Server CE 和 SQL Server 2008 R2 中为 01-MMM-yyyy 月的第一天)

【问题讨论】:

varchar/nvarchar 的大NO。日期应存储在Date 数据类型期间。将其存储在日期数据类型中并创建索引以提高性能 【参考方案1】:

完全不建议将日期值存储为 nvarchar

有很多提高连接性能的建议:

使用Date 数据类型 使用两个数字字段月份和年份而不是一个 varchar 字段tinyint 表示月份,smallint 表示年份,它们只能用于仅用于连接目的

请注意:正如@Pரதீப் 提到的,当您分别存储月份和年份时,您需要在搜索日期范围时进行一些整数操作

【讨论】:

我不会推荐你的第二个建议。当您分别存储月份和年份时,您需要在搜索日期范围时进行一些整数操作。最好将日期存储在 Date 类型中 我也同意这一点。想象一下,如果年份和月份分开存储,尝试执行>= '2017-04-01' AND < '2018-04-01'(获取财政年度)。将日期存储为DATEs,否则该数据类型的意义何在?? 也许最好只为 JOIN 操作添加这些列?因为从性能的角度来看,使用 smallint 和 tinyint 比 date 更有效。也许将这两个建议结合起来会更好? 我认为例如[MonthCol1] = [Monthcol2] is better than MONTH([DateCol1]) = MONTH([Datecol2]) @MatBailie 这些不是日期。日期代表一天。还不到一个月。

以上是关于SQL Server 连接中的 nvarchar 或 varchar 或日期的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 和 SQL Server 中的 NVARCHAR 之间的区别?

Linq - 从 SQL Server 中的 nvarchar 类型列中查找最大值

处理 SQL server 数据库中的特殊字符,应该使用 varchar 还是 nvarchar? [关闭]

将现有 SQL Server 2005 数据库中的数据类型 varchar 更改为 nvarchar。有啥问题吗?

将 Nvarchar 转换为 Int 失败的 SQL Server 2008

SQL Server中varchar(n)和nvarchar(n)