您可以使用CONVERT()
来控制日期格式,并且可以指定较小的目标字符串来裁剪结果:
SELECT CONVERT(NVARCHAR(10), GETDATE(), 21) -- YYYY-MM-DD
SELECT CONVERT(NVARCHAR(10), GETDATE(), 102) -- YYYY.MM.DD
SELECT CONVERT(NVARCHAR(10), GETDATE(), 105) -- DD-MM-YYYY
SELECT CONVERT(NVARCHAR(10), GETDATE(), 110) -- MM-DD-YYYY
SELECT CONVERT(NVARCHAR(5), GETDATE(), 105) -- DD-MM
SELECT CONVERT(NVARCHAR(5), GETDATE(), 110) -- MM-DD
SELECT CONVERT(NVARCHAR(4), GETDATE(), 102) -- YYYY
-- To get YYYY-DD-MM, put two of the above together:
SELECT CONVERT(NVARCHAR(4), GETDATE(), 102)
+ '-' + CONVERT(NVARCHAR(5), GETDATE(), 105)
要强制插入日期格式,您可以执行类似的操作:
-- Insert in Italian dd-mm-yy (e.g. 10th February 2012)
INSERT INTO user_table VALUES (CONVERT(DATETIME, '10-02-12', 5));
-- Insert in USA mm-dd-yy (2nd October 2012)
INSERT INTO user_table VALUES (CONVERT(DATETIME, '10-02-12', 10));
请参阅 Microsoft MSDN 参考CAST 和 CONVERT (Transact-SQL)。
---- 回答附加问题 ----
我发现你最近的评论有点模棱两可。如果您询问如何以datetime
字符串格式搜索两个日期之间的字段,那么请尝试以下操作:
SELECT *
FROM user_table
WHERE mydate BETWEEN convert(Datetime,'20/02/2012',103)
AND convert(Datetime,'01/03/2012')
然而,如果您尝试搜索nvarchar
具有两个字符串格式日期的字段,那么请尝试以下操作:
SELECT *
FROM user_table
WHERE convert(Datetime, mynvarchar, 103)
BETWEEN convert(Datetime,'20/02/2012',103)
AND convert(Datetime,'01/03/2012')
然而,这是非常低效的。如果您要进行大量日期搜索,我强烈建议您将日期字段存储为日期时间格式。如果您有存储 nvarchar 版本的业务需求,那没关系,但您可以使用动态列,例如:
CREATE TABLE user_table
(
mynvarchar NVARCHAR(10), -- Date as a String in DD/MM/YYYY format
mydatetime AS CONVERT(DATETIME, mynvarchar, 103) PERSISTED
);
这样做的好处是该mydatetime
字段会自动更新,并且可以根据需要在索引和约束中使用,但是,您可以通过操作mynvarchar
业务列来管理它。
以后,我能否请您在提出问题时提供更具体的示例,即您的表名、列名,这样我就不必继续发明这些了。