我有一个以nvarchar
类型保存的日期,并且我想将日期,月份和年份拆分为单独的nvarchar
变量(即三个变量)。日期如下所示:exposure_date ='2018-12-04'
,格式为yyyy-dd-mm
有什么帮助吗?
我的整个项目都陷入了困境。
答案 0 :(得分:1)
这里的“正确”答案是修复您的数据类型。在存储数据时,请始终为要存储的数据选择适当的数据类型。对于日期(没有时间部分),正确的数据类型是date
。如果要存储数字数据,则使用数字数据类型,例如int
或decimal
。 (n)varchar
并非不能适合所有数据类型,并且使用它来存储具有为其设计的数据类型的数据几乎总是一个错误的选择。 我将数据存储为(n)varchar
,因为我需要特定格式的数据从来都不是借口;让您的表示层句柄显示格式,而不是RDBMS。
因此,第一步是通过执行以下操作将日期的字符串表示形式yyyy-dd-MM
更改为ISO格式yyyyMMdd
:
UPDATE YourTable
SET exposure_date = LEFT(exposure_date,4) + RIGHT(exposure_date,2) + SUBSTRING(exposure_date,6,2);
现在您有了一个明确的表示形式,可以更改列的数据类型,而不必担心不正确的隐式强制转换或错误:
ALTER YourTable ALTER COLUMN exposure_date date;
然后,最后,您可以将数据视为日期,并使用DATEPART
函数:
SELECT DATEPART(YEAR,exposure_date) AS Exposure_Year,
DATEPART(MONTH,exposure_date) AS Exposure_Month,
DATEPART(DAY,exposure_date) AS Exposure_Day
FROM YourTable;
答案 1 :(得分:0)
您可以在下面尝试-
new mysqli
答案 2 :(得分:0)
您也可以尝试以下
Declare @myDate date
select @myDate= Cast(substring('2011-29-12', 1, 4)
+ '-' + substring('2011-29-12', 9, 2)
+ '-' + substring('2011-29-12', 6, 2)
as Date) --YYYY-MM-DD
Select @myDate as DateTime,
datename(day,@myDate) as Date,
month(@myDate) as Month,
datename(year,@myDate) as Year,
Datename(weekday,@myDate) as DayName
输出如下所示
DateTime Date Month Year DayName
--------------------------------------------
2011-29-12 29 12 2011 Thursday
您可以找到实时演示here
答案 3 :(得分:0)
如果格式固定,则可以通过substring
方法使用此简单查询:
select substring(dt, 1, 4) + '-' +
substring(dt, 9, 2) + '-' +
substring(dt, 6, 2) [YYYY-MM-DD]
from (values ('2018-31-12')) tbl(dt)
答案 4 :(得分:0)
我们直接转到主要问题,即您使用了错误的数据类型来存储日期,您应该将它们存储为ion-select
,其中的数据类型是有原因的,您需要为其中选择一个合适的数据类型。您的专栏。
因此,您需要更改表,并将列数据类型更改为DATE
而不是DATE
数据类型。
NVARCHAR
这一切都将变得容易,您只需运行以下查询即可获得所需的输出
ALTER <Table Name Here>
ALTER COLUMN <Column Name Here> DATE;
哪个是正确的最佳解决方案。
您也可以(如果您不打算更改表格)
SELECT YEAR(<Column Name Here>) TheYear,
MONTH(<Column Name Here>) TheMonth,
DAY(<Column Name Here>) TheDay
FROM <Table Name Here>
OR
CREATE TABLE Dates(
StrDate NVARCHAR(10)
);
INSERT INTO Dates VALUES
(N'2018-12-04'),
(N'Invalid');
SELECT LEFT(StrDate, 4) StrYear,
SUBSTRING(StrDate, 6, 2) StrMonth,
RIGHT(StrDate, 2) StrDay
FROM Dates;