我正在使用SQL服务器。我们在表格中有date
列,但其中一些以不同的格式存储。
例如:我们有格式为2015-12-09 00:00:12.000
的记录,但有些记录的格式为2015/09/09 00:08:09.000
或任何其他有效日期类型。
如何从表中识别具有不同日期格式的记录。
我尝试使用isdate()
函数,但因为所有日期都有效,所以没有运气。
你能指导我吗?
答案 0 :(得分:1)
解决方案第1部分
虽然此解决方案可能无法完全解决您的问题,但至少您可以将日期统一为彼此相似,那么您应该通过在查询顶部放置以下内容来大大改善您的位置:
SET DATEFORMAT DMY
OR
SET DATEFORMAT YMD
OR
SET DATEFORMAT MDY
实施例
SELECT
[date]
FROM
[your_table]
注意事项:
M表示月份,D表示日期,Y表示年份。
设置DATEFORMAT会影响日期在结果集中的显示方式以及日期如何转换为VARCHAR等。
如果您没有设置DATEFORMAT,那么在不同的机器/设置上运行相同的存储过程会产生不同的结果。
解决方案第2部分
您还可以执行一些字符串操作,将 - , / 等替换为您选择的字符。
..将以下内容放在查询的顶部:
DECLARE @DateSeparator NVARCHAR(1) = '/'
..将以下内容用作select语句的一部分:
REPLACE(REPLACE([date], '/', @DateSeparator), '-', @DateSeparator)
实施例
SELECT
REPLACE(REPLACE(CONVERT(NVARCHAR(20), [date]), '/', @DateSeparator), '-', @DateSeparator) AS [date]
FROM
[your_table]
注意事项:
两个解决方案合并
实施例
SET DATEFORMAT YMD
SELECT
REPLACE(REPLACE(CONVERT(NVARCHAR(20), [date]), '/', @DateSeparator), '-', @DateSeparator) AS [date]
FROM
[your_table]
注意事项:
答案 1 :(得分:0)
由于日期存储为VARCHAR
而不是DATETIME
(因为它们应该存在),因此确实没有办法通过SQL来确定它。是日期' 2016-02-01' 2月1日或1月2日?如果你不能说出任何计算机代码如何解决它?
您最好的办法是返回已在表格中插入或更新数据的应用程序,并尝试找出它们可能已使用的内容。如果用户只是输入数据,那么这可能不太有帮助,虽然你可能会寻找一些一致性--Janice总是输入数据MM / DD / YYYY,但皮埃尔总是把它放在DD / MM / YYYY等等这可能是缩小范围的最佳选择。否则,您可能会查看系统中的其他数据 - 例如,如果表格中还有inserted_on
列,那么可能是那个,而您的另一个日期通常会在几天之内,等等。