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
提高连接性能? ,我应该:
【问题讨论】:
对varchar/nvarchar
的大NO。日期应存储在Date
数据类型期间。将其存储在日期数据类型中并创建索引以提高性能
【参考方案1】:
完全不建议将日期值存储为 nvarchar
有很多提高连接性能的建议:
使用Date
数据类型
使用两个数字字段月份和年份而不是一个 varchar 字段(tinyint
表示月份,smallint
表示年份,它们只能用于仅用于连接目的)
请注意:正如@Pரதீப் 提到的,当您分别存储月份和年份时,您需要在搜索日期范围时进行一些整数操作
【讨论】:
我不会推荐你的第二个建议。当您分别存储月份和年份时,您需要在搜索日期范围时进行一些整数操作。最好将日期存储在 Date 类型中 我也同意这一点。想象一下,如果年份和月份分开存储,尝试执行>= '2017-04-01' AND < '2018-04-01'
(获取财政年度)。将日期存储为DATE
s,否则该数据类型的意义何在??
也许最好只为 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。有啥问题吗?