转换' 01-Sep-2017'到' 01/09/2017'在T-SQL?

时间:2018-03-26 14:26:26

标签: c# sql sql-server sql-server-2008 tsql

我在C#/ WPF中开发了一个应用程序,它以两种格式保存表中的nvarchar列,一个是连字符,另一个是正向破折号,如下所示:' 01-Sep-2017&# 39;到' 01/09/2017'

最简单的解决方案是转换日期格式为2017年9月1日的日期'到' 01/09/2017'在查询中获取数据应该是什么?

我该怎么做?

或者我应该使用某种更新语句来转换并将日期保存为适当的格式?

注意:但是如果不容易的话。我有两种格式的不同数据。它应该折叠到同一天。

3 个答案:

答案 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月的第一个,例如德语。
  • .Net framework DateTime struct直接映射到SQL Server DateDateTimeDateTime2数据类型。将日期存储为字符串意味着您必须在应用程序层和数据库之间传递日期的额外工作。

说了这么多,如果您仍然无法重构数据库以正确存储日期,则可以使用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