我在C#/ WPF中开发了一个应用程序,它以两种格式保存表中的nvarchar
列,一个是连字符,另一个是正向破折号,如下所示:' 01-Sep-2017&# 39;到' 01/09/2017'
最简单的解决方案是转换日期格式为2017年9月1日的日期'到' 01/09/2017'在查询中获取数据应该是什么?
我该怎么做?
或者我应该使用某种更新语句来转换并将日期保存为适当的格式?
注意:但是如果不容易的话。我有两种格式的不同数据。它应该折叠到同一天。
答案 0 :(得分:2)
您需要确保您的SQL Server以英语安装。一旦你确定转换功能应该完成工作
SELECT CONVERT(DATETIME, '02-Sep-2017')
如果您需要将其转换为您分享的字符串:
SELECT CONVERT(VARCHAR, CONVERT(DATETIME, '02-Sep-2017'), 103)
样式参考here
答案 1 :(得分:2)
SELECT CONVERT (VARCHAR (20), YourField, 103) FROM YourTable
您可以在此处查看格式:https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql
答案 2 :(得分:2)
正如几乎每个人都在评论中所指出的,以及任何知道他们在数据库方面做了什么的人,将日期存储为字符串是一个可怕的想法,这只会导致问题。
这是一个(非常)简短的原因列表:
'13/09/2017'
存储在一行中而'Banana'
存储在另一行中。'13/14/1000'
或'31-Feb-2020'
甚至'01-Dev-1999'
'01-Dez-2017'
是2017年12月的第一个,例如德语。DateTime
struct直接映射到SQL Server Date
,DateTime
,DateTime2
数据类型。将日期存储为字符串意味着您必须在应用程序层和数据库之间传递日期的额外工作。说了这么多,如果您仍然无法重构数据库以正确存储日期,则可以使用convert
将日期的字符串表示更改为正确的日期。由于它是2008版本,Try_convert
不在表中,因此您需要使用几个公用表表达式来处理日期的不同字符串表示:
CREATE TABLE Terrible
(
StringDate varchar(20)
);
INSERT INTO Terrible VALUES
('01-Sep-2017'), ('01/09/2017'),('Banana'),('30/02/2017');
SET DATEFORMAT DMY;
SELECT CONVERT(char(10), DateValue, 103)
FROM
(
SELECT CONVERT(Date, REPLACE(StringDate, '-', ' '), 106) As DateValue
FROM Terrible
WHERE StringDate LIKE '[0-9][0-9]-[a-z|A-Z][a-z|A-Z][a-z|A-Z]-[0-9][0-9][0-9][0-9]%'
UNION ALL
SELECT CONVERT(Date, StringDate, 103) As DateValue
FROM Terrible
WHERE StringDate LIKE '[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]'
AND ISDATE(StringDate) = 1
) ProperDates